Lines Matching full:dp
22 #include "cdn-dp-core.h"
23 #include "cdn-dp-reg.h"
32 void cdn_dp_set_fw_clk(struct cdn_dp_device *dp, unsigned long clk) in cdn_dp_set_fw_clk() argument
34 writel(clk / 1000000, dp->regs + SW_CLK_H); in cdn_dp_set_fw_clk()
37 void cdn_dp_clock_reset(struct cdn_dp_device *dp) in cdn_dp_clock_reset() argument
53 writel(val, dp->regs + SOURCE_DPTX_CAR); in cdn_dp_clock_reset()
56 writel(val, dp->regs + SOURCE_PHY_CAR); in cdn_dp_clock_reset()
62 writel(val, dp->regs + SOURCE_PKT_CAR); in cdn_dp_clock_reset()
70 writel(val, dp->regs + SOURCE_AIF_CAR); in cdn_dp_clock_reset()
76 writel(val, dp->regs + SOURCE_CIPHER_CAR); in cdn_dp_clock_reset()
80 writel(val, dp->regs + SOURCE_CRYPTO_CAR); in cdn_dp_clock_reset()
83 writel(0, dp->regs + APB_INT_MASK); in cdn_dp_clock_reset()
86 static int cdn_dp_mailbox_read(struct cdn_dp_device *dp) in cdn_dp_mailbox_read() argument
90 ret = readx_poll_timeout(readl, dp->regs + MAILBOX_EMPTY_ADDR, in cdn_dp_mailbox_read()
96 return readl(dp->regs + MAILBOX0_RD_DATA) & 0xff; in cdn_dp_mailbox_read()
99 static int cdp_dp_mailbox_write(struct cdn_dp_device *dp, u8 val) in cdp_dp_mailbox_write() argument
103 ret = readx_poll_timeout(readl, dp->regs + MAILBOX_FULL_ADDR, in cdp_dp_mailbox_write()
109 writel(val, dp->regs + MAILBOX0_WR_DATA); in cdp_dp_mailbox_write()
114 static int cdn_dp_mailbox_validate_receive(struct cdn_dp_device *dp, in cdn_dp_mailbox_validate_receive() argument
124 ret = cdn_dp_mailbox_read(dp); in cdn_dp_mailbox_validate_receive()
140 if (cdn_dp_mailbox_read(dp) < 0) in cdn_dp_mailbox_validate_receive()
149 static int cdn_dp_mailbox_read_receive(struct cdn_dp_device *dp, in cdn_dp_mailbox_read_receive() argument
156 ret = cdn_dp_mailbox_read(dp); in cdn_dp_mailbox_read_receive()
166 static int cdn_dp_mailbox_send(struct cdn_dp_device *dp, u8 module_id, in cdn_dp_mailbox_send() argument
178 ret = cdp_dp_mailbox_write(dp, header[i]); in cdn_dp_mailbox_send()
184 ret = cdp_dp_mailbox_write(dp, message[i]); in cdn_dp_mailbox_send()
192 static int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) in cdn_dp_reg_write() argument
202 return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_REGISTER, in cdn_dp_reg_write()
206 static int cdn_dp_reg_write_bit(struct cdn_dp_device *dp, u16 addr, in cdn_dp_reg_write_bit() argument
220 return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_FIELD, in cdn_dp_reg_write_bit()
224 int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) in cdn_dp_dpcd_read() argument
234 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_DPCD, in cdn_dp_dpcd_read()
239 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_dpcd_read()
245 ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); in cdn_dp_dpcd_read()
249 ret = cdn_dp_mailbox_read_receive(dp, data, len); in cdn_dp_dpcd_read()
255 int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) in cdn_dp_dpcd_write() argument
266 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_DPCD, in cdn_dp_dpcd_write()
271 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_dpcd_write()
276 ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); in cdn_dp_dpcd_write()
285 DRM_DEV_ERROR(dp->dev, "dpcd write failed: %d\n", ret); in cdn_dp_dpcd_write()
289 int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem, in cdn_dp_load_firmware() argument
297 dp->regs + APB_CTRL); in cdn_dp_load_firmware()
300 writel(*i_mem++, dp->regs + ADDR_IMEM + i); in cdn_dp_load_firmware()
303 writel(*d_mem++, dp->regs + ADDR_DMEM + i); in cdn_dp_load_firmware()
306 writel(0, dp->regs + APB_CTRL); in cdn_dp_load_firmware()
309 ret = readx_poll_timeout(readl, dp->regs + KEEP_ALIVE, in cdn_dp_load_firmware()
312 DRM_DEV_ERROR(dp->dev, "failed to loaded the FW reg = %x\n", in cdn_dp_load_firmware()
317 reg = readl(dp->regs + VER_L) & 0xff; in cdn_dp_load_firmware()
318 dp->fw_version = reg; in cdn_dp_load_firmware()
319 reg = readl(dp->regs + VER_H) & 0xff; in cdn_dp_load_firmware()
320 dp->fw_version |= reg << 8; in cdn_dp_load_firmware()
321 reg = readl(dp->regs + VER_LIB_L_ADDR) & 0xff; in cdn_dp_load_firmware()
322 dp->fw_version |= reg << 16; in cdn_dp_load_firmware()
323 reg = readl(dp->regs + VER_LIB_H_ADDR) & 0xff; in cdn_dp_load_firmware()
324 dp->fw_version |= reg << 24; in cdn_dp_load_firmware()
326 DRM_DEV_DEBUG(dp->dev, "firmware version: %x\n", dp->fw_version); in cdn_dp_load_firmware()
331 int cdn_dp_set_firmware_active(struct cdn_dp_device *dp, bool enable) in cdn_dp_set_firmware_active() argument
343 ret = cdp_dp_mailbox_write(dp, msg[i]); in cdn_dp_set_firmware_active()
350 ret = cdn_dp_mailbox_read(dp); in cdn_dp_set_firmware_active()
361 DRM_DEV_ERROR(dp->dev, "set firmware active failed\n"); in cdn_dp_set_firmware_active()
365 int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip) in cdn_dp_set_host_cap() argument
379 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, in cdn_dp_set_host_cap()
385 ret = cdn_dp_reg_write(dp, DP_AUX_SWAP_INVERSION_CONTROL, in cdn_dp_set_host_cap()
390 DRM_DEV_ERROR(dp->dev, "set host cap failed: %d\n", ret); in cdn_dp_set_host_cap()
394 int cdn_dp_event_config(struct cdn_dp_device *dp) in cdn_dp_event_config() argument
403 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_ENABLE_EVENT, in cdn_dp_event_config()
406 DRM_DEV_ERROR(dp->dev, "set event config failed: %d\n", ret); in cdn_dp_event_config()
411 u32 cdn_dp_get_event(struct cdn_dp_device *dp) in cdn_dp_get_event() argument
413 return readl(dp->regs + SW_EVENTS0); in cdn_dp_get_event()
416 int cdn_dp_get_hpd_status(struct cdn_dp_device *dp) in cdn_dp_get_hpd_status() argument
421 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_HPD_STATE, in cdn_dp_get_hpd_status()
426 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_get_hpd_status()
431 ret = cdn_dp_mailbox_read_receive(dp, &status, sizeof(status)); in cdn_dp_get_hpd_status()
438 DRM_DEV_ERROR(dp->dev, "get hpd status failed: %d\n", ret); in cdn_dp_get_hpd_status()
445 struct cdn_dp_device *dp = data; in cdn_dp_get_edid_block() local
453 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_GET_EDID, in cdn_dp_get_edid_block()
458 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_get_edid_block()
464 ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg)); in cdn_dp_get_edid_block()
468 ret = cdn_dp_mailbox_read_receive(dp, edid, length); in cdn_dp_get_edid_block()
477 DRM_DEV_ERROR(dp->dev, "get block[%d] edid failed: %d\n", block, in cdn_dp_get_edid_block()
483 static int cdn_dp_training_start(struct cdn_dp_device *dp) in cdn_dp_training_start() argument
492 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_TRAINING_CONTROL, in cdn_dp_training_start()
500 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, in cdn_dp_training_start()
505 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_training_start()
511 ret = cdn_dp_mailbox_read_receive(dp, event, sizeof(event)); in cdn_dp_training_start()
522 DRM_DEV_ERROR(dp->dev, "training failed: %d\n", ret); in cdn_dp_training_start()
526 static int cdn_dp_get_training_status(struct cdn_dp_device *dp) in cdn_dp_get_training_status() argument
531 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_LINK_STAT, in cdn_dp_get_training_status()
536 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, in cdn_dp_get_training_status()
542 ret = cdn_dp_mailbox_read_receive(dp, status, sizeof(status)); in cdn_dp_get_training_status()
546 dp->link.rate = status[0]; in cdn_dp_get_training_status()
547 dp->link.num_lanes = status[1]; in cdn_dp_get_training_status()
551 DRM_DEV_ERROR(dp->dev, "get training status failed: %d\n", ret); in cdn_dp_get_training_status()
555 int cdn_dp_train_link(struct cdn_dp_device *dp) in cdn_dp_train_link() argument
559 ret = cdn_dp_training_start(dp); in cdn_dp_train_link()
561 DRM_DEV_ERROR(dp->dev, "Failed to start training %d\n", ret); in cdn_dp_train_link()
565 ret = cdn_dp_get_training_status(dp); in cdn_dp_train_link()
567 DRM_DEV_ERROR(dp->dev, "Failed to get training stat %d\n", ret); in cdn_dp_train_link()
571 DRM_DEV_DEBUG_KMS(dp->dev, "rate:0x%x, lanes:%d\n", dp->link.rate, in cdn_dp_train_link()
572 dp->link.num_lanes); in cdn_dp_train_link()
576 int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active) in cdn_dp_set_video_status() argument
583 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_SET_VIDEO, in cdn_dp_set_video_status()
586 DRM_DEV_ERROR(dp->dev, "set video status failed: %d\n", ret); in cdn_dp_set_video_status()
638 int cdn_dp_config_video(struct cdn_dp_device *dp) in cdn_dp_config_video() argument
640 struct video_info *video = &dp->video_info; in cdn_dp_config_video()
641 struct drm_display_mode *mode = &dp->mode; in cdn_dp_config_video()
650 link_rate = drm_dp_bw_code_to_link_rate(dp->link.rate) / 1000; in cdn_dp_config_video()
652 ret = cdn_dp_reg_write(dp, BND_HSYNC2VSYNC, VIF_BYPASS_INTERLACE); in cdn_dp_config_video()
656 ret = cdn_dp_reg_write(dp, HSYNC2VSYNC_POL_CTRL, 0); in cdn_dp_config_video()
670 do_div(symbol, dp->link.num_lanes * link_rate * 8); in cdn_dp_config_video()
674 DRM_DEV_ERROR(dp->dev, in cdn_dp_config_video()
676 mode->clock, dp->link.num_lanes, in cdn_dp_config_video()
685 ret = cdn_dp_reg_write(dp, DP_FRAMER_TU, val); in cdn_dp_config_video()
691 val /= (dp->link.num_lanes * link_rate); in cdn_dp_config_video()
694 ret = cdn_dp_reg_write(dp, DP_VC_TABLE(15), val); in cdn_dp_config_video()
715 ret = cdn_dp_reg_write(dp, DP_FRAMER_PXL_REPR, val); in cdn_dp_config_video()
721 ret = cdn_dp_reg_write(dp, DP_FRAMER_SP, val); in cdn_dp_config_video()
727 ret = cdn_dp_reg_write(dp, DP_FRONT_BACK_PORCH, val); in cdn_dp_config_video()
732 ret = cdn_dp_reg_write(dp, DP_BYTE_COUNT, val); in cdn_dp_config_video()
737 ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_0, val); in cdn_dp_config_video()
743 ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_1, val); in cdn_dp_config_video()
749 ret = cdn_dp_reg_write(dp, MSA_VERTICAL_0, val); in cdn_dp_config_video()
755 ret = cdn_dp_reg_write(dp, MSA_VERTICAL_1, val); in cdn_dp_config_video()
760 ret = cdn_dp_reg_write(dp, MSA_MISC, val); in cdn_dp_config_video()
764 ret = cdn_dp_reg_write(dp, STREAM_CONFIG, 1); in cdn_dp_config_video()
770 ret = cdn_dp_reg_write(dp, DP_HORIZONTAL, val); in cdn_dp_config_video()
776 ret = cdn_dp_reg_write(dp, DP_VERTICAL_0, val); in cdn_dp_config_video()
781 ret = cdn_dp_reg_write(dp, DP_VERTICAL_1, val); in cdn_dp_config_video()
785 ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 2, 1, 0); in cdn_dp_config_video()
789 DRM_DEV_ERROR(dp->dev, "config video failed: %d\n", ret); in cdn_dp_config_video()
793 int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio) in cdn_dp_audio_stop() argument
797 ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, 0); in cdn_dp_audio_stop()
799 DRM_DEV_ERROR(dp->dev, "audio stop failed: %d\n", ret); in cdn_dp_audio_stop()
803 writel(0, dp->regs + SPDIF_CTRL_ADDR); in cdn_dp_audio_stop()
806 writel(0, dp->regs + AUDIO_SRC_CNTL); in cdn_dp_audio_stop()
807 writel(0, dp->regs + AUDIO_SRC_CNFG); in cdn_dp_audio_stop()
808 writel(AUDIO_SW_RST, dp->regs + AUDIO_SRC_CNTL); in cdn_dp_audio_stop()
809 writel(0, dp->regs + AUDIO_SRC_CNTL); in cdn_dp_audio_stop()
812 writel(0, dp->regs + SMPL2PKT_CNTL); in cdn_dp_audio_stop()
813 writel(AUDIO_SW_RST, dp->regs + SMPL2PKT_CNTL); in cdn_dp_audio_stop()
814 writel(0, dp->regs + SMPL2PKT_CNTL); in cdn_dp_audio_stop()
817 writel(AUDIO_SW_RST, dp->regs + FIFO_CNTL); in cdn_dp_audio_stop()
818 writel(0, dp->regs + FIFO_CNTL); in cdn_dp_audio_stop()
821 clk_disable_unprepare(dp->spdif_clk); in cdn_dp_audio_stop()
826 int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable) in cdn_dp_audio_mute() argument
830 ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 4, 1, enable); in cdn_dp_audio_mute()
832 DRM_DEV_ERROR(dp->dev, "audio mute failed: %d\n", ret); in cdn_dp_audio_mute()
837 static void cdn_dp_audio_config_i2s(struct cdn_dp_device *dp, in cdn_dp_audio_config_i2s() argument
844 if (dp->link.num_lanes == 1) in cdn_dp_audio_config_i2s()
854 writel(0x0, dp->regs + SPDIF_CTRL_ADDR); in cdn_dp_audio_config_i2s()
856 writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL); in cdn_dp_audio_config_i2s()
862 writel(val, dp->regs + SMPL2PKT_CNFG); in cdn_dp_audio_config_i2s()
874 writel(val, dp->regs + AUDIO_SRC_CNFG); in cdn_dp_audio_config_i2s()
883 writel(val, dp->regs + STTS_BIT_CH(i)); in cdn_dp_audio_config_i2s()
917 writel(val, dp->regs + COM_CH_STTS_BITS); in cdn_dp_audio_config_i2s()
919 writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL); in cdn_dp_audio_config_i2s()
920 writel(I2S_DEC_START, dp->regs + AUDIO_SRC_CNTL); in cdn_dp_audio_config_i2s()
923 static void cdn_dp_audio_config_spdif(struct cdn_dp_device *dp) in cdn_dp_audio_config_spdif() argument
927 writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL); in cdn_dp_audio_config_spdif()
930 writel(val, dp->regs + SMPL2PKT_CNFG); in cdn_dp_audio_config_spdif()
931 writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL); in cdn_dp_audio_config_spdif()
934 writel(val, dp->regs + SPDIF_CTRL_ADDR); in cdn_dp_audio_config_spdif()
936 clk_prepare_enable(dp->spdif_clk); in cdn_dp_audio_config_spdif()
937 clk_set_rate(dp->spdif_clk, CDN_DP_SPDIF_CLK); in cdn_dp_audio_config_spdif()
940 int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio) in cdn_dp_audio_config() argument
946 reset_control_assert(dp->spdif_rst); in cdn_dp_audio_config()
947 reset_control_deassert(dp->spdif_rst); in cdn_dp_audio_config()
950 ret = cdn_dp_reg_write(dp, CM_LANE_CTRL, LANE_REF_CYC); in cdn_dp_audio_config()
954 ret = cdn_dp_reg_write(dp, CM_CTRL, 0); in cdn_dp_audio_config()
959 cdn_dp_audio_config_i2s(dp, audio); in cdn_dp_audio_config()
961 cdn_dp_audio_config_spdif(dp); in cdn_dp_audio_config()
963 ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, AUDIO_PACK_EN); in cdn_dp_audio_config()
967 DRM_DEV_ERROR(dp->dev, "audio config failed: %d\n", ret); in cdn_dp_audio_config()