Lines Matching refs:it6505

404 struct it6505 {  struct
523 static int it6505_read(struct it6505 *it6505, unsigned int reg_addr) in it6505_read() argument
527 struct device *dev = it6505->dev; in it6505_read()
529 if (!it6505->powered) in it6505_read()
532 err = regmap_read(it6505->regmap, reg_addr, &value); in it6505_read()
541 static int it6505_write(struct it6505 *it6505, unsigned int reg_addr, in it6505_write() argument
545 struct device *dev = it6505->dev; in it6505_write()
547 if (!it6505->powered) in it6505_write()
550 err = regmap_write(it6505->regmap, reg_addr, reg_val); in it6505_write()
561 static int it6505_set_bits(struct it6505 *it6505, unsigned int reg, in it6505_set_bits() argument
565 struct device *dev = it6505->dev; in it6505_set_bits()
567 if (!it6505->powered) in it6505_set_bits()
570 err = regmap_update_bits(it6505->regmap, reg, mask, value); in it6505_set_bits()
580 static void it6505_debug_print(struct it6505 *it6505, unsigned int reg, in it6505_debug_print() argument
583 struct device *dev = it6505->dev; in it6505_debug_print()
589 val = it6505_read(it6505, reg); in it6505_debug_print()
598 static int it6505_dpcd_read(struct it6505 *it6505, unsigned long offset) in it6505_dpcd_read() argument
602 struct device *dev = it6505->dev; in it6505_dpcd_read()
604 ret = drm_dp_dpcd_readb(&it6505->aux, offset, &value); in it6505_dpcd_read()
612 static int it6505_dpcd_write(struct it6505 *it6505, unsigned long offset, in it6505_dpcd_write() argument
616 struct device *dev = it6505->dev; in it6505_dpcd_write()
618 ret = drm_dp_dpcd_writeb(&it6505->aux, offset, datain); in it6505_dpcd_write()
626 static int it6505_get_dpcd(struct it6505 *it6505, int offset, u8 *dpcd, int num) in it6505_get_dpcd() argument
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()
642 static void it6505_dump(struct it6505 *it6505) in it6505_dump() argument
646 struct device *dev = it6505->dev; in it6505_dump()
650 regs[j] = it6505_read(it6505, i + j); in it6505_dump()
656 static bool it6505_get_sink_hpd_status(struct it6505 *it6505) in it6505_get_sink_hpd_status() argument
660 reg_0d = it6505_read(it6505, REG_SYSTEM_STS); in it6505_get_sink_hpd_status()
668 static int it6505_read_word(struct it6505 *it6505, unsigned int reg) in it6505_read_word() argument
672 val0 = it6505_read(it6505, reg); in it6505_read_word()
676 val1 = it6505_read(it6505, reg + 1); in it6505_read_word()
683 static void it6505_calc_video_info(struct it6505 *it6505) in it6505_calc_video_info() argument
685 struct device *dev = it6505->dev; in it6505_calc_video_info()
692 rddata = it6505_read(it6505, REG_INPUT_CTRL); in it6505_calc_video_info()
697 htotal = it6505_read_word(it6505, REG_INPUT_HTOTAL) & 0x1FFF; in it6505_calc_video_info()
698 hdes = it6505_read_word(it6505, REG_INPUT_HACTIVE_START) & 0x1FFF; in it6505_calc_video_info()
699 hdew = it6505_read_word(it6505, REG_INPUT_HACTIVE_WIDTH) & 0x1FFF; in it6505_calc_video_info()
700 hfph = it6505_read_word(it6505, REG_INPUT_HFRONT_PORCH) & 0x1FFF; in it6505_calc_video_info()
701 hsyncw = it6505_read_word(it6505, REG_INPUT_HSYNC_WIDTH) & 0x1FFF; in it6505_calc_video_info()
703 vtotal = it6505_read_word(it6505, REG_INPUT_VTOTAL) & 0xFFF; in it6505_calc_video_info()
704 vdes = it6505_read_word(it6505, REG_INPUT_VACTIVE_START) & 0xFFF; in it6505_calc_video_info()
705 vdew = it6505_read_word(it6505, REG_INPUT_VACTIVE_WIDTH) & 0xFFF; in it6505_calc_video_info()
706 vfph = it6505_read_word(it6505, REG_INPUT_VFRONT_PORCH) & 0xFFF; in it6505_calc_video_info()
707 vsyncw = it6505_read_word(it6505, REG_INPUT_VSYNC_WIDTH) & 0xFFF; in it6505_calc_video_info()
715 it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, in it6505_calc_video_info()
718 it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, in it6505_calc_video_info()
720 rddata = it6505_read_word(it6505, REG_PCLK_COUNTER_VALUE) & 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()
781 static void it6505_clear_int(struct it6505 *it6505) in it6505_clear_int() argument
783 it6505_write(it6505, INT_STATUS_01, 0xFF); in it6505_clear_int()
784 it6505_write(it6505, INT_STATUS_02, 0xFF); in it6505_clear_int()
785 it6505_write(it6505, INT_STATUS_03, 0xFF); in it6505_clear_int()
788 static void it6505_int_mask_enable(struct it6505 *it6505) in it6505_int_mask_enable() argument
790 it6505_write(it6505, INT_MASK_01, BIT(INT_HPD_CHANGE) | in it6505_int_mask_enable()
794 it6505_write(it6505, INT_MASK_02, BIT(INT_AUX_CMD_FAIL) | in it6505_int_mask_enable()
797 it6505_write(it6505, INT_MASK_03, BIT(INT_LINK_TRAIN_FAIL) | in it6505_int_mask_enable()
801 static void it6505_int_mask_disable(struct it6505 *it6505) in it6505_int_mask_disable() argument
803 it6505_write(it6505, INT_MASK_01, 0x00); in it6505_int_mask_disable()
804 it6505_write(it6505, INT_MASK_02, 0x00); in it6505_int_mask_disable()
805 it6505_write(it6505, INT_MASK_03, 0x00); in it6505_int_mask_disable()
808 static void it6505_lane_termination_on(struct it6505 *it6505) in it6505_lane_termination_on() argument
812 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_lane_termination_on()
815 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x00); in it6505_lane_termination_on()
818 if (it6505->lane_swap) { in it6505_lane_termination_on()
819 switch (it6505->lane_count) { in it6505_lane_termination_on()
822 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
826 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
831 switch (it6505->lane_count) { in it6505_lane_termination_on()
834 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
838 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
846 static void it6505_lane_termination_off(struct it6505 *it6505) in it6505_lane_termination_off() argument
850 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_lane_termination_off()
853 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); in it6505_lane_termination_off()
856 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x0C, 0x00); in it6505_lane_termination_off()
859 static void it6505_lane_power_on(struct it6505 *it6505) in it6505_lane_power_on() argument
861 it6505_set_bits(it6505, REG_LINK_DRV, 0xF1, in it6505_lane_power_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()
868 static void it6505_lane_power_off(struct it6505 *it6505) in it6505_lane_power_off() argument
870 it6505_set_bits(it6505, REG_LINK_DRV, 0xF0, 0x00); in it6505_lane_power_off()
873 static void it6505_lane_off(struct it6505 *it6505) in it6505_lane_off() argument
875 it6505_lane_power_off(it6505); in it6505_lane_off()
876 it6505_lane_termination_off(it6505); in it6505_lane_off()
879 static void it6505_aux_termination_on(struct it6505 *it6505) in it6505_aux_termination_on() argument
883 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_aux_termination_on()
886 it6505_lane_termination_on(it6505); in it6505_aux_termination_on()
889 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); in it6505_aux_termination_on()
892 static void it6505_aux_power_on(struct it6505 *it6505) in it6505_aux_power_on() argument
894 it6505_set_bits(it6505, REG_AUX, 0x02, 0x02); in it6505_aux_power_on()
897 static void it6505_aux_on(struct it6505 *it6505) in it6505_aux_on() argument
899 it6505_aux_power_on(it6505); in it6505_aux_on()
900 it6505_aux_termination_on(it6505); in it6505_aux_on()
903 static void it6505_aux_reset(struct it6505 *it6505) in it6505_aux_reset() argument
905 it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, AUX_RESET); in it6505_aux_reset()
906 it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, 0x00); in it6505_aux_reset()
909 static void it6505_reset_logic(struct it6505 *it6505) in it6505_reset_logic() argument
911 regmap_write(it6505->regmap, REG_RESET_CTRL, ALL_LOGIC_RESET); in it6505_reset_logic()
915 static bool it6505_aux_op_finished(struct it6505 *it6505) in it6505_aux_op_finished() argument
917 int reg2b = it6505_read(it6505, REG_AUX_CMD_REQ); in it6505_aux_op_finished()
925 static int it6505_aux_wait(struct it6505 *it6505) in it6505_aux_wait() argument
929 struct device *dev = it6505->dev; in it6505_aux_wait()
933 while (!it6505_aux_op_finished(it6505)) { in it6505_aux_wait()
941 status = it6505_read(it6505, REG_AUX_ERROR_STS); in it6505_aux_wait()
950 static ssize_t it6505_aux_operation(struct it6505 *it6505, in it6505_aux_operation() argument
958 if (!it6505_get_sink_hpd_status(it6505)) in it6505_aux_operation()
962 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE); in it6505_aux_operation()
969 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
973 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
979 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR, in it6505_aux_operation()
984 it6505_write(it6505, REG_AUX_ADR_0_7, (address >> 0) & 0xFF); in it6505_aux_operation()
986 it6505_write(it6505, REG_AUX_ADR_8_15, (address >> 8) & 0xFF); in it6505_aux_operation()
988 it6505_write(it6505, REG_AUX_ADR_16_19, in it6505_aux_operation()
992 regmap_bulk_write(it6505->regmap, REG_AUX_OUT_DATA0, buffer, in it6505_aux_operation()
996 it6505_write(it6505, REG_AUX_CMD_REQ, cmd); in it6505_aux_operation()
998 ret = it6505_aux_wait(it6505); in it6505_aux_operation()
1002 ret = it6505_read(it6505, REG_AUX_ERROR_STS); in it6505_aux_operation()
1032 ret = it6505_read(it6505, REG_AUX_DATA_FIFO); in it6505_aux_operation()
1039 ret = it6505_read(it6505, REG_AUX_DATA_0_7 + i); in it6505_aux_operation()
1057 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1060 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1065 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, 0); in it6505_aux_operation()
1070 static ssize_t it6505_aux_do_transfer(struct it6505 *it6505, in it6505_aux_do_transfer() argument
1077 mutex_lock(&it6505->aux_lock); in it6505_aux_do_transfer()
1080 ret_size = it6505_aux_operation(it6505, cmd, address + i, in it6505_aux_do_transfer()
1092 mutex_unlock(&it6505->aux_lock); in it6505_aux_do_transfer()
1099 struct it6505 *it6505 = container_of(aux, struct it6505, aux); in it6505_aux_transfer() local
1120 ret = it6505_aux_do_transfer(it6505, cmd, msg->address, msg->buffer, in it6505_aux_transfer()
1143 struct it6505 *it6505 = data; in it6505_get_edid_block() local
1144 struct device *dev = it6505->dev; in it6505_get_edid_block()
1148 it6505_aux_reset(it6505); in it6505_get_edid_block()
1152 ret = it6505_aux_do_transfer(it6505, CMD_AUX_I2C_EDID_READ, in it6505_get_edid_block()
1178 static void it6505_variable_config(struct it6505 *it6505) in it6505_variable_config() argument
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()
1199 static int it6505_send_video_infoframe(struct it6505 *it6505, in it6505_send_video_infoframe() argument
1204 struct device *dev = it6505->dev; in it6505_send_video_infoframe()
1212 err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0x00); in it6505_send_video_infoframe()
1216 err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1, in it6505_send_video_infoframe()
1222 err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, in it6505_send_video_infoframe()
1230 static void it6505_get_extcon_property(struct it6505 *it6505) in it6505_get_extcon_property() argument
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()
1248 static void it6505_clk_phase_adjustment(struct it6505 *it6505, in it6505_clk_phase_adjustment() argument
1253 it6505_set_bits(it6505, REG_CLK_CTRL0, M_PCLK_DELAY, in it6505_clk_phase_adjustment()
1255 it6505_set_bits(it6505, REG_DATA_CTRL0, VIDEO_LATCH_EDGE, in it6505_clk_phase_adjustment()
1259 static void it6505_link_reset_step_train(struct it6505 *it6505) in it6505_link_reset_step_train() argument
1261 it6505_set_bits(it6505, REG_TRAIN_CTRL0, in it6505_link_reset_step_train()
1263 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_link_reset_step_train()
1267 static void it6505_init(struct it6505 *it6505) in it6505_init() argument
1269 it6505_write(it6505, REG_AUX_OPT, AUX_AUTO_RST | AUX_FIX_FREQ); in it6505_init()
1270 it6505_write(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR); in it6505_init()
1271 it6505_write(it6505, REG_HDCP_CTRL2, HDCP_AN_SEL | HDCP_HW_HPDIRQ_ACT); in it6505_init()
1272 it6505_write(it6505, REG_VID_BUS_CTRL0, IN_DDR | DDR_CD); in it6505_init()
1273 it6505_write(it6505, REG_VID_BUS_CTRL1, 0x01); in it6505_init()
1274 it6505_write(it6505, REG_AUDIO_CTRL0, AUDIO_16B_BOUND); in it6505_init()
1277 it6505_write(it6505, REG_HPD_IRQ_TIME, 0xF5); in it6505_init()
1278 it6505_write(it6505, REG_AUX_DEBUG_MODE, 0x4D); in it6505_init()
1279 it6505_write(it6505, REG_AUX_OPT2, 0x17); in it6505_init()
1280 it6505_write(it6505, REG_HDCP_OPT, 0x60); in it6505_init()
1281 it6505_write(it6505, REG_DATA_MUTE_CTRL, in it6505_init()
1283 it6505_write(it6505, REG_TIME_STMP_CTRL, in it6505_init()
1285 it6505_write(it6505, REG_INFOFRAME_CTRL, 0x00); in it6505_init()
1286 it6505_write(it6505, REG_DRV_0_DB_800_MV, in it6505_init()
1287 afe_setting_table[it6505->afe_setting][0]); in it6505_init()
1288 it6505_write(it6505, REG_PRE_0_DB_800_MV, in it6505_init()
1289 afe_setting_table[it6505->afe_setting][1]); in it6505_init()
1290 it6505_write(it6505, REG_PRE_3P5_DB_800_MV, in it6505_init()
1291 afe_setting_table[it6505->afe_setting][2]); in it6505_init()
1292 it6505_write(it6505, REG_SSC_CTRL0, 0x9E); in it6505_init()
1293 it6505_write(it6505, REG_SSC_CTRL1, 0x1C); in it6505_init()
1294 it6505_write(it6505, REG_SSC_CTRL2, 0x42); in it6505_init()
1297 static void it6505_video_disable(struct it6505 *it6505) in it6505_video_disable() argument
1299 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); in it6505_video_disable()
1300 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); in it6505_video_disable()
1301 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); in it6505_video_disable()
1304 static void it6505_video_reset(struct it6505 *it6505) in it6505_video_reset() argument
1306 it6505_link_reset_step_train(it6505); in it6505_video_reset()
1307 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); in it6505_video_reset()
1308 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); in it6505_video_reset()
1309 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); in it6505_video_reset()
1310 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, RST_501_FIFO); in it6505_video_reset()
1311 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, 0x00); in it6505_video_reset()
1312 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, 0x00); in it6505_video_reset()
1315 static void it6505_update_video_parameter(struct it6505 *it6505, in it6505_update_video_parameter() argument
1318 it6505_clk_phase_adjustment(it6505, mode); in it6505_update_video_parameter()
1319 it6505_video_disable(it6505); in it6505_update_video_parameter()
1322 static bool it6505_audio_input(struct it6505 *it6505) in it6505_audio_input() argument
1326 reg05 = it6505_read(it6505, REG_RESET_CTRL); in it6505_audio_input()
1327 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); in it6505_audio_input()
1329 regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); in it6505_audio_input()
1330 it6505_write(it6505, REG_RESET_CTRL, reg05); in it6505_audio_input()
1335 static void it6505_setup_audio_channel_status(struct it6505 *it6505) in it6505_setup_audio_channel_status() argument
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()
1342 it6505_write(it6505, REG_IEC958_STS1, 0x00); in it6505_setup_audio_channel_status()
1343 it6505_write(it6505, REG_IEC958_STS2, 0x00); in it6505_setup_audio_channel_status()
1344 it6505_write(it6505, REG_IEC958_STS3, sample_rate); in it6505_setup_audio_channel_status()
1345 it6505_write(it6505, REG_IEC958_STS4, (~sample_rate << 4) | in it6505_setup_audio_channel_status()
1346 audio_word_length_map[it6505->audio.word_length]); in it6505_setup_audio_channel_status()
1349 static void it6505_setup_audio_format(struct it6505 *it6505) in it6505_setup_audio_format() argument
1352 it6505_write(it6505, REG_AUDIO_FMT, in it6505_setup_audio_format()
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()
1360 it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0x00); in it6505_setup_audio_format()
1362 it6505_set_bits(it6505, REG_AUX_OPT, 0xF0, 0x30); in it6505_setup_audio_format()
1364 it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0xE4); in it6505_setup_audio_format()
1367 it6505_write(it6505, REG_AUDIO_CTRL0, 0x20); in it6505_setup_audio_format()
1368 it6505_write(it6505, REG_AUDIO_CTRL1, 0x00); in it6505_setup_audio_format()
1371 static void it6505_enable_audio_source(struct it6505 *it6505) in it6505_enable_audio_source() argument
1375 audio_source_count = BIT(DIV_ROUND_UP(it6505->audio.channel_count, 2)) in it6505_enable_audio_source()
1378 audio_source_count |= it6505->audio.select << 4; in it6505_enable_audio_source()
1380 it6505_write(it6505, REG_AUDIO_SRC_CTRL, audio_source_count); in it6505_enable_audio_source()
1383 static void it6505_enable_audio_infoframe(struct it6505 *it6505) in it6505_enable_audio_infoframe() argument
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()
1393 it6505_write(it6505, REG_AUD_INFOFRAM_DB2, 0x00); in it6505_enable_audio_infoframe()
1394 it6505_write(it6505, REG_AUD_INFOFRAM_DB3, in it6505_enable_audio_infoframe()
1395 audio_info_ca[it6505->audio.channel_count - 1]); in it6505_enable_audio_infoframe()
1396 it6505_write(it6505, REG_AUD_INFOFRAM_DB4, 0x00); in it6505_enable_audio_infoframe()
1397 it6505_write(it6505, REG_AUD_INFOFRAM_SUM, 0x00); in it6505_enable_audio_infoframe()
1400 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, in it6505_enable_audio_infoframe()
1404 static void it6505_disable_audio(struct it6505 *it6505) in it6505_disable_audio() argument
1406 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, EN_AUD_MUTE); in it6505_disable_audio()
1407 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, M_AUDIO_I2S_EN, 0x00); in it6505_disable_audio()
1408 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, 0x00); in it6505_disable_audio()
1409 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, AUDIO_RESET); in it6505_disable_audio()
1412 static void it6505_enable_audio(struct it6505 *it6505) in it6505_enable_audio() argument
1414 struct device *dev = it6505->dev; in it6505_enable_audio()
1418 it6505_disable_audio(it6505); in it6505_enable_audio()
1420 it6505_setup_audio_channel_status(it6505); in it6505_enable_audio()
1421 it6505_setup_audio_format(it6505); in it6505_enable_audio()
1422 it6505_enable_audio_source(it6505); in it6505_enable_audio()
1423 it6505_enable_audio_infoframe(it6505); in it6505_enable_audio()
1425 it6505_write(it6505, REG_AUDIO_N_0_7, 0x00); in it6505_enable_audio()
1426 it6505_write(it6505, REG_AUDIO_N_8_15, 0x80); in it6505_enable_audio()
1427 it6505_write(it6505, REG_AUDIO_N_16_23, 0x00); in it6505_enable_audio()
1429 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, in it6505_enable_audio()
1431 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, 0x00); in it6505_enable_audio()
1432 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); in it6505_enable_audio()
1433 regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); in it6505_enable_audio()
1436 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, 0x00); in it6505_enable_audio()
1439 static bool it6505_use_step_train_check(struct it6505 *it6505) in it6505_use_step_train_check() argument
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()
1447 static void it6505_parse_link_capabilities(struct it6505 *it6505) in it6505_parse_link_capabilities() argument
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()
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()
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()
1503 bcaps = it6505_dpcd_read(it6505, DP_AUX_HDCP_BCAPS); 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()
1518 static void it6505_setup_ssc(struct it6505 *it6505) in it6505_setup_ssc() argument
1520 it6505_set_bits(it6505, REG_TRAIN_CTRL0, SPREAD_AMP_5, in it6505_setup_ssc()
1521 it6505->enable_ssc ? SPREAD_AMP_5 : 0x00); in it6505_setup_ssc()
1522 if (it6505->enable_ssc) { in it6505_setup_ssc()
1523 it6505_write(it6505, REG_SSC_CTRL0, 0x9E); in it6505_setup_ssc()
1524 it6505_write(it6505, REG_SSC_CTRL1, 0x1C); in it6505_setup_ssc()
1525 it6505_write(it6505, REG_SSC_CTRL2, 0x42); in it6505_setup_ssc()
1526 it6505_write(it6505, REG_SP_CTRL0, 0x07); in it6505_setup_ssc()
1527 it6505_write(it6505, REG_IP_CTRL1, 0x29); in it6505_setup_ssc()
1528 it6505_write(it6505, REG_IP_CTRL2, 0x03); in it6505_setup_ssc()
1530 it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, in it6505_setup_ssc()
1532 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, in it6505_setup_ssc()
1535 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, 0x00); in it6505_setup_ssc()
1536 it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, in it6505_setup_ssc()
1541 static inline void it6505_link_rate_setup(struct it6505 *it6505) in it6505_link_rate_setup() argument
1543 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_LBR, in it6505_link_rate_setup()
1544 (it6505->link_rate_bw_code == RBR) ? FORCE_LBR : 0x00); in it6505_link_rate_setup()
1545 it6505_set_bits(it6505, REG_LINK_DRV, DRV_HS, in it6505_link_rate_setup()
1546 (it6505->link_rate_bw_code == RBR) ? 0x00 : DRV_HS); in it6505_link_rate_setup()
1549 static void it6505_lane_count_setup(struct it6505 *it6505) in it6505_lane_count_setup() argument
1551 it6505_get_extcon_property(it6505); in it6505_lane_count_setup()
1552 it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_SWAP, in it6505_lane_count_setup()
1553 it6505->lane_swap ? LANE_SWAP : 0x00); in it6505_lane_count_setup()
1554 it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_COUNT_MASK, in it6505_lane_count_setup()
1555 (it6505->lane_count - 1) << 1); in it6505_lane_count_setup()
1558 static void it6505_link_training_setup(struct it6505 *it6505) in it6505_link_training_setup() argument
1560 struct device *dev = it6505->dev; in it6505_link_training_setup()
1562 if (it6505->enable_enhanced_frame) in it6505_link_training_setup()
1563 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, in it6505_link_training_setup()
1566 it6505_link_rate_setup(it6505); in it6505_link_training_setup()
1567 it6505_lane_count_setup(it6505); in it6505_link_training_setup()
1568 it6505_setup_ssc(it6505); 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()
1577 static bool it6505_link_start_auto_train(struct it6505 *it6505) in it6505_link_start_auto_train() argument
1582 mutex_lock(&it6505->aux_lock); in it6505_link_start_auto_train()
1583 it6505_set_bits(it6505, REG_TRAIN_CTRL0, in it6505_link_start_auto_train()
1585 it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); in it6505_link_start_auto_train()
1586 it6505_write(it6505, REG_TRAIN_CTRL1, AUTO_TRAIN); in it6505_link_start_auto_train()
1590 link_training_state = it6505_read(it6505, REG_LINK_TRAIN_STS); in it6505_link_start_auto_train()
1601 mutex_unlock(&it6505->aux_lock); in it6505_link_start_auto_train()
1606 static int it6505_drm_dp_link_configure(struct it6505 *it6505) in it6505_drm_dp_link_configure() argument
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()
1649 step_train_lane_voltage_para_set(struct it6505 *it6505, in step_train_lane_voltage_para_set() argument
1658 for (i = 0; i < it6505->lane_count; i++) { in step_train_lane_voltage_para_set()
1671 it6505_dpcd_write(it6505, DP_TRAINING_LANE0_SET + i, in step_train_lane_voltage_para_set()
1675 it6505_dpcd_read(it6505, DP_TRAINING_LANE0_SET + i)) in step_train_lane_voltage_para_set()
1683 it6505_step_cr_train(struct it6505 *it6505, in it6505_step_cr_train() argument
1690 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_cr_train()
1692 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, in it6505_step_cr_train()
1693 it6505->enable_ssc ? DP_SPREAD_AMP_0_5 : 0x00); in it6505_step_cr_train()
1694 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_cr_train()
1699 if (!step_train_lane_voltage_para_set(it6505, 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()
1707 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_CR_DONE, 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()
1750 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_cr_train()
1757 it6505_step_eq_train(struct it6505 *it6505, in it6505_step_eq_train() argument
1762 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_eq_train()
1764 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
1770 if (!step_train_lane_voltage_para_set(it6505, 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()
1782 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
1784 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, 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()
1810 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
1815 static bool it6505_link_start_step_train(struct it6505 *it6505) in it6505_link_start_step_train() argument
1823 DRM_DEV_DEBUG_DRIVER(it6505->dev, "start"); in it6505_link_start_step_train()
1824 err = it6505_drm_dp_link_configure(it6505); in it6505_link_start_step_train()
1828 if (!it6505_step_cr_train(it6505, &lane_voltage_pre_emphasis)) in it6505_link_start_step_train()
1830 if (!it6505_step_eq_train(it6505, &lane_voltage_pre_emphasis)) in it6505_link_start_step_train()
1835 static bool it6505_get_video_status(struct it6505 *it6505) in it6505_get_video_status() argument
1839 reg_0d = it6505_read(it6505, REG_SYSTEM_STS); in it6505_get_video_status()
1847 static void it6505_reset_hdcp(struct it6505 *it6505) in it6505_reset_hdcp() argument
1849 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_reset_hdcp()
1851 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, 0x00); in it6505_reset_hdcp()
1852 it6505_set_bits(it6505, REG_RESET_CTRL, HDCP_RESET, HDCP_RESET); in it6505_reset_hdcp()
1855 static void it6505_start_hdcp(struct it6505 *it6505) in it6505_start_hdcp() argument
1857 struct device *dev = it6505->dev; in it6505_start_hdcp()
1860 it6505_reset_hdcp(it6505); in it6505_start_hdcp()
1861 queue_delayed_work(system_wq, &it6505->hdcp_work, in it6505_start_hdcp()
1865 static void it6505_stop_hdcp(struct it6505 *it6505) in it6505_stop_hdcp() argument
1867 it6505_reset_hdcp(it6505); in it6505_stop_hdcp()
1868 cancel_delayed_work(&it6505->hdcp_work); in it6505_stop_hdcp()
1883 static void it6505_hdcp_part1_auth(struct it6505 *it6505) in it6505_hdcp_part1_auth() argument
1885 struct device *dev = it6505->dev; in it6505_hdcp_part1_auth()
1888 it6505_set_bits(it6505, REG_RESET_CTRL, HDCP_RESET, 0x00); in it6505_hdcp_part1_auth()
1890 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, 0x00); in it6505_hdcp_part1_auth()
1893 hdcp_bcaps = it6505_dpcd_read(it6505, DP_AUX_HDCP_BCAPS); in it6505_hdcp_part1_auth()
1901 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_part1_auth()
1906 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_AN_GEN, HDCP_AN_GEN); in it6505_hdcp_part1_auth()
1910 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_AN_GEN, 0x00); in it6505_hdcp_part1_auth()
1912 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, HDCP_CP_ENABLE); in it6505_hdcp_part1_auth()
1914 it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_START, in it6505_hdcp_part1_auth()
1917 it6505->hdcp_status = HDCP_AUTH_GOING; in it6505_hdcp_part1_auth()
1920 static int it6505_sha1_digest(struct it6505 *it6505, u8 *sha1_input, in it6505_sha1_digest() argument
1926 struct device *dev = it6505->dev; in it6505_sha1_digest()
1949 static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input) in it6505_setup_sha1_input() argument
1951 struct device *dev = it6505->dev; in it6505_setup_sha1_input()
1955 err = it6505_get_dpcd(it6505, DP_AUX_HDCP_BINFO, binfo, in it6505_setup_sha1_input()
1980 err = it6505_get_dpcd(it6505, DP_AUX_HDCP_KSV_FIFO + in it6505_setup_sha1_input()
1991 it6505->hdcp_down_stream_count = down_stream_count; in it6505_setup_sha1_input()
1995 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_EN_M0_READ, in it6505_setup_sha1_input()
1998 err = regmap_bulk_read(it6505->regmap, REG_M0_0_7, in it6505_setup_sha1_input()
2001 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_EN_M0_READ, 0x00); in it6505_setup_sha1_input()
2013 static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505) in it6505_hdcp_part2_ksvlist_check() argument
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()
2025 it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av); in it6505_hdcp_part2_ksvlist_check()
2027 err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv, in it6505_hdcp_part2_ksvlist_check()
2046 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_hdcp_wait_ksv_list() local
2048 struct device *dev = it6505->dev; in it6505_hdcp_wait_ksv_list()
2055 if (!it6505_get_sink_hpd_status(it6505)) in it6505_hdcp_wait_ksv_list()
2058 bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS); in it6505_hdcp_wait_ksv_list()
2072 ksv_list_check = it6505_hdcp_part2_ksvlist_check(it6505); in it6505_hdcp_wait_ksv_list()
2076 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_wait_ksv_list()
2081 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_wait_ksv_list()
2088 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_hdcp_work() local
2090 struct device *dev = it6505->dev; in it6505_hdcp_work()
2096 if (!it6505_get_sink_hpd_status(it6505)) 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()
2104 !it6505_get_video_status(it6505)) { 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()
2113 it6505_set_bits(it6505, REG_HDCP_TRIGGER, 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()
2122 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_work()
2126 it6505_hdcp_part1_auth(it6505); in it6505_hdcp_work()
2129 static void it6505_show_hdcp_info(struct it6505 *it6505) in it6505_show_hdcp_info() argument
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()
2156 static void it6505_stop_link_train(struct it6505 *it6505) in it6505_stop_link_train() argument
2158 it6505->link_state = LINK_IDLE; in it6505_stop_link_train()
2159 cancel_work_sync(&it6505->link_works); in it6505_stop_link_train()
2160 it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); in it6505_stop_link_train()
2163 static void it6505_link_train_ok(struct it6505 *it6505) in it6505_link_train_ok() argument
2165 struct device *dev = it6505->dev; in it6505_link_train_ok()
2167 it6505->link_state = LINK_OK; in it6505_link_train_ok()
2169 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, 0x00); in it6505_link_train_ok()
2170 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, in it6505_link_train_ok()
2173 if (it6505_audio_input(it6505)) { in it6505_link_train_ok()
2175 it6505_enable_audio(it6505); in it6505_link_train_ok()
2178 if (it6505->hdcp_desired) in it6505_link_train_ok()
2179 it6505_start_hdcp(it6505); in it6505_link_train_ok()
2182 static void it6505_link_step_train_process(struct it6505 *it6505) in it6505_link_step_train_process() argument
2184 struct device *dev = it6505->dev; in it6505_link_step_train_process()
2189 if (it6505->sink_count == 0) { in it6505_link_step_train_process()
2191 it6505->sink_count); in it6505_link_step_train_process()
2192 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, in it6505_link_step_train_process()
2197 if (!it6505->step_train) { in it6505_link_step_train_process()
2204 it6505_link_reset_step_train(it6505); in it6505_link_step_train_process()
2205 ret = it6505_link_start_step_train(it6505); in it6505_link_step_train_process()
2209 it6505_link_train_ok(it6505); in it6505_link_step_train_process()
2215 it6505->link_state = LINK_IDLE; in it6505_link_step_train_process()
2216 it6505_video_reset(it6505); in it6505_link_step_train_process()
2221 struct it6505 *it6505 = container_of(work, struct it6505, link_works); in it6505_link_training_work() local
2222 struct device *dev = it6505->dev; in it6505_link_training_work()
2226 it6505->sink_count); in it6505_link_training_work()
2228 if (!it6505_get_sink_hpd_status(it6505)) in it6505_link_training_work()
2231 it6505_link_training_setup(it6505); in it6505_link_training_work()
2232 it6505_reset_hdcp(it6505); in it6505_link_training_work()
2233 it6505_aux_reset(it6505); in it6505_link_training_work()
2235 if (it6505->auto_train_retry < 1) { in it6505_link_training_work()
2236 it6505_link_step_train_process(it6505); in it6505_link_training_work()
2240 ret = it6505_link_start_auto_train(it6505); 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()
2246 it6505_link_train_ok(it6505); in it6505_link_training_work()
2250 it6505_dump(it6505); in it6505_link_training_work()
2253 static void it6505_plugged_status_to_codec(struct it6505 *it6505) in it6505_plugged_status_to_codec() argument
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()
2262 static void it6505_remove_edid(struct it6505 *it6505) in it6505_remove_edid() argument
2264 kfree(it6505->cached_edid); in it6505_remove_edid()
2265 it6505->cached_edid = NULL; in it6505_remove_edid()
2268 static int it6505_process_hpd_irq(struct it6505 *it6505) in it6505_process_hpd_irq() argument
2270 struct device *dev = it6505->dev; in it6505_process_hpd_irq()
2274 if (!it6505_get_sink_hpd_status(it6505)) { in it6505_process_hpd_irq()
2276 it6505->sink_count = 0; in it6505_process_hpd_irq()
2280 ret = it6505_dpcd_read(it6505, DP_SINK_COUNT); 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()
2291 it6505_reset_logic(it6505); in it6505_process_hpd_irq()
2292 it6505_int_mask_enable(it6505); in it6505_process_hpd_irq()
2293 it6505_init(it6505); in it6505_process_hpd_irq()
2294 it6505_remove_edid(it6505); in it6505_process_hpd_irq()
2298 dp_irq_vector = it6505_dpcd_read(it6505, DP_DEVICE_SERVICE_IRQ_VECTOR); in it6505_process_hpd_irq()
2305 it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ, in it6505_process_hpd_irq()
2308 bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS); 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()
2326 it6505_video_reset(it6505); in it6505_process_hpd_irq()
2332 static void it6505_irq_hpd(struct it6505 *it6505) in it6505_irq_hpd() argument
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()
2344 it6505_aux_on(it6505); 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()
2348 it6505_variable_config(it6505); in it6505_irq_hpd()
2349 it6505_parse_link_capabilities(it6505); 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()
2355 dp_sink_count = it6505_dpcd_read(it6505, DP_SINK_COUNT); in it6505_irq_hpd()
2356 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); in it6505_irq_hpd()
2359 it6505->sink_count); in it6505_irq_hpd()
2361 it6505_lane_termination_on(it6505); in it6505_irq_hpd()
2362 it6505_lane_power_on(it6505); 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()
2374 if (!it6505_get_video_status(it6505)) in it6505_irq_hpd()
2375 it6505_video_reset(it6505); in it6505_irq_hpd()
2377 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_irq_hpd()
2378 it6505_remove_edid(it6505); in it6505_irq_hpd()
2380 if (it6505->hdcp_desired) in it6505_irq_hpd()
2381 it6505_stop_hdcp(it6505); in it6505_irq_hpd()
2383 it6505_video_disable(it6505); in it6505_irq_hpd()
2384 it6505_disable_audio(it6505); in it6505_irq_hpd()
2385 it6505_stop_link_train(it6505); in it6505_irq_hpd()
2386 it6505_lane_off(it6505); in it6505_irq_hpd()
2387 it6505_link_reset_step_train(it6505); 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()
2394 static void it6505_irq_hpd_irq(struct it6505 *it6505) in it6505_irq_hpd_irq() argument
2396 struct device *dev = it6505->dev; in it6505_irq_hpd_irq()
2400 if (it6505_process_hpd_irq(it6505) < 0) in it6505_irq_hpd_irq()
2404 static void it6505_irq_scdt(struct it6505 *it6505) in it6505_irq_scdt() argument
2406 struct device *dev = it6505->dev; in it6505_irq_scdt()
2409 data = it6505_get_video_status(it6505); in it6505_irq_scdt()
2412 it6505_calc_video_info(it6505); in it6505_irq_scdt()
2413 it6505_link_reset_step_train(it6505); in it6505_irq_scdt()
2416 schedule_work(&it6505->link_works); in it6505_irq_scdt()
2419 static void it6505_irq_hdcp_done(struct it6505 *it6505) in it6505_irq_hdcp_done() argument
2421 struct device *dev = it6505->dev; in it6505_irq_hdcp_done()
2424 it6505->hdcp_status = HDCP_AUTH_DONE; in it6505_irq_hdcp_done()
2425 it6505_show_hdcp_info(it6505); in it6505_irq_hdcp_done()
2428 static void it6505_irq_hdcp_fail(struct it6505 *it6505) in it6505_irq_hdcp_fail() argument
2430 struct device *dev = it6505->dev; in it6505_irq_hdcp_fail()
2433 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_irq_hdcp_fail()
2434 it6505_show_hdcp_info(it6505); in it6505_irq_hdcp_fail()
2435 it6505_start_hdcp(it6505); in it6505_irq_hdcp_fail()
2438 static void it6505_irq_aux_cmd_fail(struct it6505 *it6505) in it6505_irq_aux_cmd_fail() argument
2440 struct device *dev = it6505->dev; in it6505_irq_aux_cmd_fail()
2445 static void it6505_irq_hdcp_ksv_check(struct it6505 *it6505) in it6505_irq_hdcp_ksv_check() argument
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()
2453 static void it6505_irq_audio_fifo_error(struct it6505 *it6505) in it6505_irq_audio_fifo_error() argument
2455 struct device *dev = it6505->dev; in it6505_irq_audio_fifo_error()
2459 if (it6505_audio_input(it6505)) in it6505_irq_audio_fifo_error()
2460 it6505_enable_audio(it6505); in it6505_irq_audio_fifo_error()
2463 static void it6505_irq_link_train_fail(struct it6505 *it6505) in it6505_irq_link_train_fail() argument
2465 struct device *dev = it6505->dev; in it6505_irq_link_train_fail()
2468 schedule_work(&it6505->link_works); in it6505_irq_link_train_fail()
2471 static void it6505_irq_video_fifo_error(struct it6505 *it6505) in it6505_irq_video_fifo_error() argument
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()
2478 it6505_stop_hdcp(it6505); in it6505_irq_video_fifo_error()
2479 it6505_video_reset(it6505); in it6505_irq_video_fifo_error()
2482 static void it6505_irq_io_latch_fifo_overflow(struct it6505 *it6505) in it6505_irq_io_latch_fifo_overflow() argument
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()
2489 it6505_stop_hdcp(it6505); in it6505_irq_io_latch_fifo_overflow()
2490 it6505_video_reset(it6505); in it6505_irq_io_latch_fifo_overflow()
2500 struct it6505 *it6505 = data; in it6505_int_threaded_handler() local
2501 struct device *dev = it6505->dev; in it6505_int_threaded_handler()
2504 void (*handler)(struct it6505 *it6505); in it6505_int_threaded_handler()
2520 if (it6505->enable_drv_hold || !it6505->powered) in it6505_int_threaded_handler()
2525 int_status[0] = it6505_read(it6505, INT_STATUS_01); in it6505_int_threaded_handler()
2526 int_status[1] = it6505_read(it6505, INT_STATUS_02); in it6505_int_threaded_handler()
2527 int_status[2] = it6505_read(it6505, INT_STATUS_03); in it6505_int_threaded_handler()
2529 it6505_write(it6505, INT_STATUS_01, int_status[0]); in it6505_int_threaded_handler()
2530 it6505_write(it6505, INT_STATUS_02, int_status[1]); in it6505_int_threaded_handler()
2531 it6505_write(it6505, INT_STATUS_03, int_status[2]); in it6505_int_threaded_handler()
2536 it6505_debug_print(it6505, REG_SYSTEM_STS, ""); in it6505_int_threaded_handler()
2539 irq_vec[0].handler(it6505); in it6505_int_threaded_handler()
2541 if (it6505->hpd_state) { in it6505_int_threaded_handler()
2544 irq_vec[i].handler(it6505); in it6505_int_threaded_handler()
2553 static int it6505_poweron(struct it6505 *it6505) in it6505_poweron() argument
2555 struct device *dev = it6505->dev; in it6505_poweron()
2556 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_poweron()
2561 if (it6505->powered) { in it6505_poweron()
2593 it6505->powered = true; in it6505_poweron()
2594 it6505_reset_logic(it6505); in it6505_poweron()
2595 it6505_int_mask_enable(it6505); in it6505_poweron()
2596 it6505_init(it6505); in it6505_poweron()
2597 it6505_lane_off(it6505); in it6505_poweron()
2602 static int it6505_poweroff(struct it6505 *it6505) in it6505_poweroff() argument
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()
2630 it6505->powered = false; in it6505_poweroff()
2631 it6505->sink_count = 0; in it6505_poweroff()
2636 static enum drm_connector_status it6505_detect(struct it6505 *it6505) in it6505_detect() argument
2638 struct device *dev = it6505->dev; 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()
2659 dp_sink_count = it6505_dpcd_read(it6505, DP_SINK_COUNT); in it6505_detect()
2660 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); 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()
2679 it6505_plugged_status_to_codec(it6505); in it6505_detect()
2682 mutex_unlock(&it6505->mode_lock); in it6505_detect()
2690 struct it6505 *it6505 = container_of(self, struct it6505, event_nb); in it6505_extcon_notifier() local
2692 schedule_work(&it6505->extcon_wq); in it6505_extcon_notifier()
2698 struct it6505 *it6505 = container_of(work, struct it6505, extcon_wq); in it6505_extcon_work() local
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()
2724 it6505_poweron(it6505); 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()
2741 static int it6505_use_notifier_module(struct it6505 *it6505) in it6505_use_notifier_module() argument
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()
2761 static void it6505_remove_notifier_module(struct it6505 *it6505) in it6505_remove_notifier_module() argument
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()
2774 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_delayed_audio() local
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()
2783 it6505_enable_audio(it6505); in it6505_delayed_audio()
2786 static int __maybe_unused it6505_audio_setup_hw_params(struct it6505 *it6505, in it6505_audio_setup_hw_params() argument
2790 struct device *dev = it6505->dev; in it6505_audio_setup_hw_params()
2797 if (!it6505->bridge.encoder) in it6505_audio_setup_hw_params()
2802 it6505->audio.channel_count); in it6505_audio_setup_hw_params()
2806 it6505->audio.channel_count = params->cea.channels; in it6505_audio_setup_hw_params()
2818 it6505->audio.sample_rate = audio_sample_rate_map[i].rate; 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()
2845 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_audio_shutdown() local
2847 if (it6505->powered) in it6505_audio_shutdown()
2848 it6505_disable_audio(it6505); in it6505_audio_shutdown()
2856 struct it6505 *it6505 = data; in it6505_audio_hook_plugged_cb() local
2858 it6505->plugged_cb = fn; in it6505_audio_hook_plugged_cb()
2859 it6505->codec_dev = codec_dev; in it6505_audio_hook_plugged_cb()
2860 it6505_plugged_status_to_codec(it6505); in it6505_audio_hook_plugged_cb()
2865 static inline struct it6505 *bridge_to_it6505(struct drm_bridge *bridge) in bridge_to_it6505()
2867 return container_of(bridge, struct it6505, bridge); in bridge_to_it6505()
2873 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_attach() local
2874 struct device *dev = it6505->dev; 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()
2898 ret = it6505_use_notifier_module(it6505); in it6505_bridge_attach()
2910 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_detach() local
2912 flush_work(&it6505->link_works); in it6505_bridge_detach()
2913 it6505_remove_notifier_module(it6505); in it6505_bridge_detach()
2921 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_mode_valid() local
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()
2937 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_enable() local
2938 struct device *dev = it6505->dev; in it6505_bridge_atomic_enable()
2976 it6505_update_video_parameter(it6505, mode); in it6505_bridge_atomic_enable()
2978 ret = it6505_send_video_infoframe(it6505, &frame); in it6505_bridge_atomic_enable()
2983 it6505_int_mask_enable(it6505); in it6505_bridge_atomic_enable()
2984 it6505_video_reset(it6505); in it6505_bridge_atomic_enable()
2986 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_bridge_atomic_enable()
2993 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_disable() local
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()
3001 it6505_video_disable(it6505); in it6505_bridge_atomic_disable()
3008 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_pre_enable() local
3009 struct device *dev = it6505->dev; in it6505_bridge_atomic_pre_enable()
3019 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_post_disable() local
3020 struct device *dev = it6505->dev; in it6505_bridge_atomic_post_disable()
3030 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_detect() local
3032 return it6505_detect(it6505); in it6505_bridge_detect()
3038 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_get_edid() local
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()
3043 it6505); 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()
3071 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_bridge_resume() local
3073 return it6505_poweron(it6505); in it6505_bridge_resume()
3078 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_bridge_suspend() local
3080 return it6505_poweroff(it6505); in it6505_bridge_suspend()
3088 static int it6505_init_pdata(struct it6505 *it6505) in it6505_init_pdata() argument
3090 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_init_pdata()
3091 struct device *dev = it6505->dev; in it6505_init_pdata()
3131 static void it6505_parse_dt(struct it6505 *it6505) in it6505_parse_dt() argument
3133 struct device *dev = it6505->dev; 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()
3145 if (it6505->lane_swap_disabled) in it6505_parse_dt()
3146 it6505->lane_swap = false; 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() local
3217 if (!it6505) in receive_timing_debugfs_show()
3220 it6505_calc_video_info(it6505); in receive_timing_debugfs_show()
3221 vid = &it6505->video_info; in receive_timing_debugfs_show()
3250 struct it6505 *it6505 = data; in force_power_on_off_debugfs_write() local
3252 if (!it6505) in force_power_on_off_debugfs_write()
3256 it6505_poweron(it6505); in force_power_on_off_debugfs_write()
3258 it6505_poweroff(it6505); in force_power_on_off_debugfs_write()
3265 struct it6505 *it6505 = data; in enable_drv_hold_debugfs_show() local
3267 if (!it6505) in enable_drv_hold_debugfs_show()
3270 *buf = it6505->enable_drv_hold; in enable_drv_hold_debugfs_show()
3277 struct it6505 *it6505 = data; in enable_drv_hold_debugfs_write() local
3279 if (!it6505) 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()
3285 it6505_int_mask_disable(it6505); in enable_drv_hold_debugfs_write()
3287 it6505_clear_int(it6505); in enable_drv_hold_debugfs_write()
3288 it6505_int_mask_enable(it6505); 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()
3292 it6505_get_sink_hpd_status(it6505) ? in enable_drv_hold_debugfs_write()
3296 it6505->connector_status = in enable_drv_hold_debugfs_write()
3324 static void debugfs_create_files(struct it6505 *it6505) in debugfs_create_files() argument
3330 it6505->debugfs, it6505, in debugfs_create_files()
3336 static void debugfs_init(struct it6505 *it6505) in debugfs_init() argument
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()
3347 debugfs_create_files(it6505); in debugfs_init()
3350 static void it6505_debugfs_remove(struct it6505 *it6505) in it6505_debugfs_remove() argument
3352 debugfs_remove_recursive(it6505->debugfs); in it6505_debugfs_remove()
3357 struct it6505 *it6505 = dev_get_drvdata(&client->dev); in it6505_shutdown() local
3359 if (it6505->powered) in it6505_shutdown()
3360 it6505_lane_off(it6505); in it6505_shutdown()
3365 struct it6505 *it6505; in it6505_i2c_probe() local
3370 it6505 = devm_kzalloc(&client->dev, sizeof(*it6505), GFP_KERNEL); in it6505_i2c_probe()
3371 if (!it6505) 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()
3381 i2c_set_clientdata(client, it6505); 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()
3401 err = it6505_init_pdata(it6505); in it6505_i2c_probe()
3407 it6505_parse_dt(it6505); 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()
3435 it6505_poweron(it6505); in it6505_i2c_probe()
3438 debugfs_init(it6505); 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()
3457 struct it6505 *it6505 = i2c_get_clientdata(client); in it6505_i2c_remove() local
3459 drm_bridge_remove(&it6505->bridge); in it6505_i2c_remove()
3460 drm_dp_aux_unregister(&it6505->aux); in it6505_i2c_remove()
3461 it6505_debugfs_remove(it6505); in it6505_i2c_remove()
3462 it6505_poweroff(it6505); in it6505_i2c_remove()
3463 it6505_remove_edid(it6505); in it6505_i2c_remove()