Lines Matching full:hdmi
12 #include <linux/hdmi.h>
24 #include <sound/hdmi-codec.h>
177 static inline u8 hdmi_readb(struct inno_hdmi *hdmi, u16 offset) in hdmi_readb() argument
179 return readl_relaxed(hdmi->regs + (offset) * 0x04); in hdmi_readb()
182 static inline void hdmi_writeb(struct inno_hdmi *hdmi, u16 offset, u32 val) in hdmi_writeb() argument
184 writel_relaxed(val, hdmi->regs + (offset) * 0x04); in hdmi_writeb()
187 static inline void hdmi_modb(struct inno_hdmi *hdmi, u16 offset, in hdmi_modb() argument
190 u8 temp = hdmi_readb(hdmi, offset) & ~msk; in hdmi_modb()
193 hdmi_writeb(hdmi, offset, temp); in hdmi_modb()
196 static void inno_hdmi_i2c_init(struct inno_hdmi *hdmi) in inno_hdmi_i2c_init() argument
200 ddc_bus_freq = (hdmi->tmds_rate >> 2) / HDMI_SCL_RATE; in inno_hdmi_i2c_init()
202 hdmi_writeb(hdmi, DDC_BUS_FREQ_L, ddc_bus_freq & 0xFF); in inno_hdmi_i2c_init()
203 hdmi_writeb(hdmi, DDC_BUS_FREQ_H, (ddc_bus_freq >> 8) & 0xFF); in inno_hdmi_i2c_init()
206 hdmi_writeb(hdmi, HDMI_INTERRUPT_MASK1, 0); in inno_hdmi_i2c_init()
207 hdmi_writeb(hdmi, HDMI_INTERRUPT_STATUS1, m_INT_EDID_READY); in inno_hdmi_i2c_init()
210 static void inno_hdmi_sys_power(struct inno_hdmi *hdmi, bool enable) in inno_hdmi_sys_power() argument
213 hdmi_modb(hdmi, HDMI_SYS_CTRL, m_POWER, v_PWR_ON); in inno_hdmi_sys_power()
215 hdmi_modb(hdmi, HDMI_SYS_CTRL, m_POWER, v_PWR_OFF); in inno_hdmi_sys_power()
218 static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode) in inno_hdmi_set_pwr_mode() argument
221 hdmi->plat_data->phy_config; in inno_hdmi_set_pwr_mode()
225 inno_hdmi_sys_power(hdmi, false); in inno_hdmi_set_pwr_mode()
227 if (hdmi->tmds_rate <= phy_config->mpixelclock) in inno_hdmi_set_pwr_mode()
231 hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, in inno_hdmi_set_pwr_mode()
233 hdmi_writeb(hdmi, HDMI_PHY_DRIVER, phy_config->vlev_ctr); in inno_hdmi_set_pwr_mode()
235 hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15); in inno_hdmi_set_pwr_mode()
236 hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x14); in inno_hdmi_set_pwr_mode()
237 hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x10); in inno_hdmi_set_pwr_mode()
238 hdmi_writeb(hdmi, HDMI_PHY_CHG_PWR, 0x0f); in inno_hdmi_set_pwr_mode()
239 hdmi_writeb(hdmi, HDMI_PHY_SYNC, 0x00); in inno_hdmi_set_pwr_mode()
240 hdmi_writeb(hdmi, HDMI_PHY_SYNC, 0x01); in inno_hdmi_set_pwr_mode()
242 inno_hdmi_sys_power(hdmi, true); in inno_hdmi_set_pwr_mode()
246 inno_hdmi_sys_power(hdmi, false); in inno_hdmi_set_pwr_mode()
247 hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0x00); in inno_hdmi_set_pwr_mode()
248 hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x00); in inno_hdmi_set_pwr_mode()
249 hdmi_writeb(hdmi, HDMI_PHY_CHG_PWR, 0x00); in inno_hdmi_set_pwr_mode()
250 hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15); in inno_hdmi_set_pwr_mode()
255 DRM_DEV_ERROR(hdmi->dev, "Unknown power mode %d\n", mode); in inno_hdmi_set_pwr_mode()
259 static void inno_hdmi_reset(struct inno_hdmi *hdmi) in inno_hdmi_reset() argument
264 hdmi_modb(hdmi, HDMI_SYS_CTRL, m_RST_DIGITAL, v_NOT_RST_DIGITAL); in inno_hdmi_reset()
267 hdmi_modb(hdmi, HDMI_SYS_CTRL, m_RST_ANALOG, v_NOT_RST_ANALOG); in inno_hdmi_reset()
272 hdmi_modb(hdmi, HDMI_SYS_CTRL, msk, val); in inno_hdmi_reset()
274 inno_hdmi_set_pwr_mode(hdmi, NORMAL); in inno_hdmi_reset()
277 static int inno_hdmi_upload_frame(struct inno_hdmi *hdmi, int setup_rc, in inno_hdmi_upload_frame() argument
282 hdmi_modb(hdmi, HDMI_PACKET_SEND_AUTO, mask, disable); in inno_hdmi_upload_frame()
284 hdmi_writeb(hdmi, HDMI_CONTROL_PACKET_BUF_INDEX, frame_index); in inno_hdmi_upload_frame()
296 hdmi_writeb(hdmi, HDMI_CONTROL_PACKET_ADDR + i, in inno_hdmi_upload_frame()
300 hdmi_modb(hdmi, HDMI_PACKET_SEND_AUTO, mask, enable); in inno_hdmi_upload_frame()
306 static int inno_hdmi_config_video_vsi(struct inno_hdmi *hdmi, in inno_hdmi_config_video_vsi() argument
312 rc = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi, in inno_hdmi_config_video_vsi()
313 &hdmi->connector, in inno_hdmi_config_video_vsi()
316 return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_VSI, in inno_hdmi_config_video_vsi()
320 static int inno_hdmi_config_audio_aai(struct inno_hdmi *hdmi, in inno_hdmi_config_audio_aai() argument
332 return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AAI, 0, 0, 0); in inno_hdmi_config_audio_aai()
335 static int inno_hdmi_config_video_avi(struct inno_hdmi *hdmi, in inno_hdmi_config_video_avi() argument
342 &hdmi->connector, in inno_hdmi_config_video_avi()
345 if (hdmi->hdmi_data.enc_out_format == HDMI_COLORSPACE_YUV444) in inno_hdmi_config_video_avi()
347 else if (hdmi->hdmi_data.enc_out_format == HDMI_COLORSPACE_YUV422) in inno_hdmi_config_video_avi()
352 return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AVI, 0, 0, 0); in inno_hdmi_config_video_avi()
355 static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi) in inno_hdmi_config_video_csc() argument
357 struct hdmi_data_info *data = &hdmi->hdmi_data; in inno_hdmi_config_video_csc()
366 hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL1, v_DE_EXTERNAL | in inno_hdmi_config_video_csc()
373 hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL2, value); in inno_hdmi_config_video_csc()
379 hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL3, value); in inno_hdmi_config_video_csc()
381 hdmi_modb(hdmi, HDMI_VIDEO_CONTRL, in inno_hdmi_config_video_csc()
420 hdmi_writeb(hdmi, HDMI_VIDEO_CSC_COEF + i, in inno_hdmi_config_video_csc()
424 hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL3, value); in inno_hdmi_config_video_csc()
425 hdmi_modb(hdmi, HDMI_VIDEO_CONTRL, m_VIDEO_AUTO_CSC | in inno_hdmi_config_video_csc()
432 static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi, in inno_hdmi_config_video_timing() argument
437 if (hdmi->plat_data->dev_type == RK3036_HDMI) { in inno_hdmi_config_video_timing()
441 hdmi_writeb(hdmi, 0x148, value); in inno_hdmi_config_video_timing()
451 hdmi_writeb(hdmi, HDMI_VIDEO_TIMING_CTL, value); in inno_hdmi_config_video_timing()
455 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HTOTAL_L, value & 0xFF); in inno_hdmi_config_video_timing()
456 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HTOTAL_H, (value >> 8) & 0xFF); in inno_hdmi_config_video_timing()
459 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_L, value & 0xFF); in inno_hdmi_config_video_timing()
460 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_H, (value >> 8) & 0xFF); in inno_hdmi_config_video_timing()
463 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_L, value & 0xFF); in inno_hdmi_config_video_timing()
464 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_H, (value >> 8) & 0xFF); in inno_hdmi_config_video_timing()
467 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDURATION_L, value & 0xFF); in inno_hdmi_config_video_timing()
468 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDURATION_H, (value >> 8) & 0xFF); in inno_hdmi_config_video_timing()
471 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VTOTAL_L, value & 0xFF); in inno_hdmi_config_video_timing()
472 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VTOTAL_H, (value >> 8) & 0xFF); in inno_hdmi_config_video_timing()
475 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VBLANK, value & 0xFF); in inno_hdmi_config_video_timing()
478 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VDELAY, value & 0xFF); in inno_hdmi_config_video_timing()
481 hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VDURATION, value & 0xFF); in inno_hdmi_config_video_timing()
483 hdmi_writeb(hdmi, HDMI_PHY_PRE_DIV_RATIO, 0x1e); in inno_hdmi_config_video_timing()
484 hdmi_writeb(hdmi, HDMI_PHY_FEEDBACK_DIV_RATIO_LOW, 0x2c); in inno_hdmi_config_video_timing()
485 hdmi_writeb(hdmi, HDMI_PHY_FEEDBACK_DIV_RATIO_HIGH, 0x01); in inno_hdmi_config_video_timing()
490 static int inno_hdmi_setup(struct inno_hdmi *hdmi, in inno_hdmi_setup() argument
493 hdmi->hdmi_data.vic = drm_match_cea_mode(mode); in inno_hdmi_setup()
495 hdmi->hdmi_data.enc_in_format = HDMI_COLORSPACE_RGB; in inno_hdmi_setup()
496 hdmi->hdmi_data.enc_out_format = HDMI_COLORSPACE_RGB; in inno_hdmi_setup()
498 if ((hdmi->hdmi_data.vic == 6) || (hdmi->hdmi_data.vic == 7) || in inno_hdmi_setup()
499 (hdmi->hdmi_data.vic == 21) || (hdmi->hdmi_data.vic == 22) || in inno_hdmi_setup()
500 (hdmi->hdmi_data.vic == 2) || (hdmi->hdmi_data.vic == 3) || in inno_hdmi_setup()
501 (hdmi->hdmi_data.vic == 17) || (hdmi->hdmi_data.vic == 18)) in inno_hdmi_setup()
502 hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_601; in inno_hdmi_setup()
504 hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_709; in inno_hdmi_setup()
507 hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, in inno_hdmi_setup()
510 /* Set HDMI Mode */ in inno_hdmi_setup()
511 hdmi_writeb(hdmi, HDMI_HDCP_CTRL, in inno_hdmi_setup()
512 v_HDMI_DVI(hdmi->hdmi_data.sink_is_hdmi)); in inno_hdmi_setup()
514 inno_hdmi_config_video_timing(hdmi, mode); in inno_hdmi_setup()
516 inno_hdmi_config_video_csc(hdmi); in inno_hdmi_setup()
518 if (hdmi->hdmi_data.sink_is_hdmi) { in inno_hdmi_setup()
519 inno_hdmi_config_video_avi(hdmi, mode); in inno_hdmi_setup()
520 inno_hdmi_config_video_vsi(hdmi, mode); in inno_hdmi_setup()
529 hdmi->tmds_rate = mode->clock * 1000; in inno_hdmi_setup()
530 inno_hdmi_i2c_init(hdmi); in inno_hdmi_setup()
533 hdmi_modb(hdmi, HDMI_AV_MUTE, m_VIDEO_BLACK, v_VIDEO_MUTE(0)); in inno_hdmi_setup()
534 if (hdmi->audio_enable) in inno_hdmi_setup()
535 hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE, v_AUDIO_MUTE(0)); in inno_hdmi_setup()
544 struct inno_hdmi *hdmi = to_inno_hdmi(encoder); in inno_hdmi_encoder_mode_set() local
546 inno_hdmi_setup(hdmi, adj_mode); in inno_hdmi_encoder_mode_set()
549 memcpy(&hdmi->previous_mode, adj_mode, sizeof(hdmi->previous_mode)); in inno_hdmi_encoder_mode_set()
554 struct inno_hdmi *hdmi = to_inno_hdmi(encoder); in inno_hdmi_encoder_enable() local
556 inno_hdmi_set_pwr_mode(hdmi, NORMAL); in inno_hdmi_encoder_enable()
561 struct inno_hdmi *hdmi = to_inno_hdmi(encoder); in inno_hdmi_encoder_disable() local
563 inno_hdmi_set_pwr_mode(hdmi, LOWER_PWR); in inno_hdmi_encoder_disable()
597 struct inno_hdmi *hdmi = to_inno_hdmi(connector); in inno_hdmi_connector_detect() local
599 return (hdmi_readb(hdmi, HDMI_STATUS) & m_HOTPLUG) ? in inno_hdmi_connector_detect()
605 struct inno_hdmi *hdmi = to_inno_hdmi(connector); in inno_hdmi_connector_get_modes() local
609 if (!hdmi->ddc) in inno_hdmi_connector_get_modes()
612 edid = drm_get_edid(connector, hdmi->ddc); in inno_hdmi_connector_get_modes()
614 hdmi->hdmi_data.sink_is_hdmi = drm_detect_hdmi_monitor(edid); in inno_hdmi_connector_get_modes()
615 hdmi->hdmi_data.sink_has_audio = drm_detect_monitor_audio(edid); in inno_hdmi_connector_get_modes()
659 inno_hdmi_audio_config_set(struct inno_hdmi *hdmi, in inno_hdmi_audio_config_set() argument
704 dev_err(hdmi->dev, "[%s] not support such sample rate %d\n", in inno_hdmi_audio_config_set()
711 hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x09); in inno_hdmi_audio_config_set()
714 hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01); in inno_hdmi_audio_config_set()
716 hdmi_writeb(hdmi, AUDIO_SAMPLE_RATE, rate); in inno_hdmi_audio_config_set()
717 hdmi_writeb(hdmi, AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) | in inno_hdmi_audio_config_set()
720 hdmi_writeb(hdmi, AUDIO_I2S_MAP, 0x00); in inno_hdmi_audio_config_set()
721 hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, rate); in inno_hdmi_audio_config_set()
724 hdmi_writeb(hdmi, AUDIO_N_H, (N >> 16) & 0x0F); in inno_hdmi_audio_config_set()
725 hdmi_writeb(hdmi, AUDIO_N_M, (N >> 8) & 0xFF); in inno_hdmi_audio_config_set()
726 hdmi_writeb(hdmi, AUDIO_N_L, N & 0xFF); in inno_hdmi_audio_config_set()
728 /* Set hdmi nlpcm mode to support hdmi bitstream */ in inno_hdmi_audio_config_set()
729 hdmi_writeb(hdmi, HDMI_AUDIO_CHANNEL_STATUS, v_AUDIO_STATUS_NLPCM(0)); in inno_hdmi_audio_config_set()
731 return inno_hdmi_config_audio_aai(hdmi, audio); in inno_hdmi_audio_config_set()
738 struct inno_hdmi *hdmi = dev_get_drvdata(dev); in inno_hdmi_audio_prepare() local
740 if (!hdmi->hdmi_data.sink_has_audio) { in inno_hdmi_audio_prepare()
741 dev_err(hdmi->dev, "Sink do not support audio!\n"); in inno_hdmi_audio_prepare()
745 hdmi->audio_enable = 0; in inno_hdmi_audio_prepare()
746 hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_PD, v_AUDIO_PD(1)); in inno_hdmi_audio_prepare()
754 struct inno_hdmi *hdmi = dev_get_drvdata(dev); in inno_hdmi_audio_hw_params() local
761 if (!hdmi->hdmi_data.sink_has_audio) { in inno_hdmi_audio_hw_params()
762 dev_err(hdmi->dev, "Sink do not support audio!\n"); in inno_hdmi_audio_hw_params()
766 if (!hdmi->encoder.crtc) in inno_hdmi_audio_hw_params()
779 return inno_hdmi_audio_config_set(hdmi, daifmt, &audio); in inno_hdmi_audio_hw_params()
789 struct inno_hdmi *hdmi = dev_get_drvdata(dev); in inno_hdmi_audio_mute() local
791 if (!hdmi->hdmi_data.sink_has_audio) { in inno_hdmi_audio_mute()
792 dev_err(hdmi->dev, "Sink do not support audio!\n"); in inno_hdmi_audio_mute()
796 hdmi->audio_enable = !mute; in inno_hdmi_audio_mute()
799 hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, in inno_hdmi_audio_mute()
802 hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, in inno_hdmi_audio_mute()
811 struct inno_hdmi *hdmi = dev_get_drvdata(dev); in inno_hdmi_audio_get_eld() local
812 struct drm_mode_config *config = &hdmi->encoder.dev->mode_config; in inno_hdmi_audio_get_eld()
818 if (&hdmi->encoder == connector->encoder) { in inno_hdmi_audio_get_eld()
837 static int inno_hdmi_audio_codec_init(struct inno_hdmi *hdmi, in inno_hdmi_audio_codec_init() argument
856 hdmi->audio_enable = false; in inno_hdmi_audio_codec_init()
857 hdmi->audio_pdev = platform_device_register_data( in inno_hdmi_audio_codec_init()
861 return PTR_ERR_OR_ZERO(hdmi->audio_pdev); in inno_hdmi_audio_codec_init()
864 static int inno_hdmi_register(struct drm_device *drm, struct inno_hdmi *hdmi) in inno_hdmi_register() argument
866 struct drm_encoder *encoder = &hdmi->encoder; in inno_hdmi_register()
867 struct device *dev = hdmi->dev; in inno_hdmi_register()
883 hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD; in inno_hdmi_register()
885 drm_connector_helper_add(&hdmi->connector, in inno_hdmi_register()
887 drm_connector_init_with_ddc(drm, &hdmi->connector, in inno_hdmi_register()
890 hdmi->ddc); in inno_hdmi_register()
892 drm_connector_attach_encoder(&hdmi->connector, encoder); in inno_hdmi_register()
893 inno_hdmi_audio_codec_init(hdmi, dev); in inno_hdmi_register()
898 static irqreturn_t inno_hdmi_i2c_irq(struct inno_hdmi *hdmi) in inno_hdmi_i2c_irq() argument
900 struct inno_hdmi_i2c *i2c = hdmi->i2c; in inno_hdmi_i2c_irq()
903 stat = hdmi_readb(hdmi, HDMI_INTERRUPT_STATUS1); in inno_hdmi_i2c_irq()
907 /* Clear HDMI EDID interrupt flag */ in inno_hdmi_i2c_irq()
908 hdmi_writeb(hdmi, HDMI_INTERRUPT_STATUS1, m_INT_EDID_READY); in inno_hdmi_i2c_irq()
917 struct inno_hdmi *hdmi = dev_id; in inno_hdmi_hardirq() local
921 if (hdmi->i2c) in inno_hdmi_hardirq()
922 ret = inno_hdmi_i2c_irq(hdmi); in inno_hdmi_hardirq()
924 interrupt = hdmi_readb(hdmi, HDMI_STATUS); in inno_hdmi_hardirq()
926 hdmi_modb(hdmi, HDMI_STATUS, m_INT_HOTPLUG, m_INT_HOTPLUG); in inno_hdmi_hardirq()
935 struct inno_hdmi *hdmi = dev_id; in inno_hdmi_irq() local
937 drm_helper_hpd_irq_event(hdmi->connector.dev); in inno_hdmi_irq()
942 static int inno_hdmi_i2c_read(struct inno_hdmi *hdmi, struct i2c_msg *msgs) in inno_hdmi_i2c_read() argument
948 ret = wait_for_completion_timeout(&hdmi->i2c->cmp, HZ / 10); in inno_hdmi_i2c_read()
953 *buf++ = hdmi_readb(hdmi, HDMI_EDID_FIFO_ADDR); in inno_hdmi_i2c_read()
958 static int inno_hdmi_i2c_write(struct inno_hdmi *hdmi, struct i2c_msg *msgs) in inno_hdmi_i2c_write() argument
969 reinit_completion(&hdmi->i2c->cmp); in inno_hdmi_i2c_write()
972 hdmi->i2c->segment_addr = msgs->buf[0]; in inno_hdmi_i2c_write()
974 hdmi->i2c->ddc_addr = msgs->buf[0]; in inno_hdmi_i2c_write()
977 hdmi_writeb(hdmi, HDMI_EDID_FIFO_OFFSET, 0x00); in inno_hdmi_i2c_write()
980 hdmi_writeb(hdmi, HDMI_EDID_WORD_ADDR, hdmi->i2c->ddc_addr); in inno_hdmi_i2c_write()
983 hdmi_writeb(hdmi, HDMI_EDID_SEGMENT_POINTER, hdmi->i2c->segment_addr); in inno_hdmi_i2c_write()
991 struct inno_hdmi *hdmi = i2c_get_adapdata(adap); in inno_hdmi_i2c_xfer() local
992 struct inno_hdmi_i2c *i2c = hdmi->i2c; in inno_hdmi_i2c_xfer()
998 hdmi_writeb(hdmi, HDMI_INTERRUPT_MASK1, m_INT_EDID_READY); in inno_hdmi_i2c_xfer()
999 hdmi_writeb(hdmi, HDMI_INTERRUPT_STATUS1, m_INT_EDID_READY); in inno_hdmi_i2c_xfer()
1002 DRM_DEV_DEBUG(hdmi->dev, in inno_hdmi_i2c_xfer()
1007 ret = inno_hdmi_i2c_read(hdmi, &msgs[i]); in inno_hdmi_i2c_xfer()
1009 ret = inno_hdmi_i2c_write(hdmi, &msgs[i]); in inno_hdmi_i2c_xfer()
1018 /* Mute HDMI EDID interrupt */ in inno_hdmi_i2c_xfer()
1019 hdmi_writeb(hdmi, HDMI_INTERRUPT_MASK1, 0); in inno_hdmi_i2c_xfer()
1036 static struct i2c_adapter *inno_hdmi_i2c_adapter(struct inno_hdmi *hdmi) in inno_hdmi_i2c_adapter() argument
1042 i2c = devm_kzalloc(hdmi->dev, sizeof(*i2c), GFP_KERNEL); in inno_hdmi_i2c_adapter()
1052 adap->dev.parent = hdmi->dev; in inno_hdmi_i2c_adapter()
1053 adap->dev.of_node = hdmi->dev->of_node; in inno_hdmi_i2c_adapter()
1055 strlcpy(adap->name, "Inno HDMI", sizeof(adap->name)); in inno_hdmi_i2c_adapter()
1056 i2c_set_adapdata(adap, hdmi); in inno_hdmi_i2c_adapter()
1060 dev_warn(hdmi->dev, "cannot add %s I2C adapter\n", adap->name); in inno_hdmi_i2c_adapter()
1061 devm_kfree(hdmi->dev, i2c); in inno_hdmi_i2c_adapter()
1065 hdmi->i2c = i2c; in inno_hdmi_i2c_adapter()
1067 DRM_DEV_INFO(hdmi->dev, "registered %s I2C bus driver\n", adap->name); in inno_hdmi_i2c_adapter()
1097 { .compatible = "rockchip,rk3036-inno-hdmi",
1100 { .compatible = "rockchip,rk3128-inno-hdmi",
1112 struct inno_hdmi *hdmi; in inno_hdmi_bind() local
1117 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); in inno_hdmi_bind()
1118 if (!hdmi) in inno_hdmi_bind()
1121 hdmi->dev = dev; in inno_hdmi_bind()
1122 hdmi->drm_dev = drm; in inno_hdmi_bind()
1123 hdmi->plat_data = device_get_match_data(hdmi->dev); in inno_hdmi_bind()
1126 hdmi->regs = devm_ioremap_resource(dev, iores); in inno_hdmi_bind()
1127 if (IS_ERR(hdmi->regs)) in inno_hdmi_bind()
1128 return PTR_ERR(hdmi->regs); in inno_hdmi_bind()
1134 hdmi->aclk = devm_clk_get(hdmi->dev, "aclk"); in inno_hdmi_bind()
1135 if (IS_ERR(hdmi->aclk)) { in inno_hdmi_bind()
1136 dev_err(hdmi->dev, "Unable to get HDMI aclk clk\n"); in inno_hdmi_bind()
1137 return PTR_ERR(hdmi->aclk); in inno_hdmi_bind()
1140 hdmi->pclk = devm_clk_get(hdmi->dev, "pclk"); in inno_hdmi_bind()
1141 if (IS_ERR(hdmi->pclk)) { in inno_hdmi_bind()
1142 DRM_DEV_ERROR(hdmi->dev, "Unable to get HDMI pclk clk\n"); in inno_hdmi_bind()
1143 return PTR_ERR(hdmi->pclk); in inno_hdmi_bind()
1146 ret = clk_prepare_enable(hdmi->aclk); in inno_hdmi_bind()
1148 DRM_DEV_ERROR(hdmi->dev, in inno_hdmi_bind()
1149 "Cannot enable HDMI aclk clock: %d\n", ret); in inno_hdmi_bind()
1153 ret = clk_prepare_enable(hdmi->pclk); in inno_hdmi_bind()
1155 dev_err(hdmi->dev, "Cannot enable HDMI pclk clock: %d\n", ret); in inno_hdmi_bind()
1159 inno_hdmi_reset(hdmi); in inno_hdmi_bind()
1161 hdmi->ddc = inno_hdmi_i2c_adapter(hdmi); in inno_hdmi_bind()
1162 if (IS_ERR(hdmi->ddc)) { in inno_hdmi_bind()
1163 ret = PTR_ERR(hdmi->ddc); in inno_hdmi_bind()
1164 hdmi->ddc = NULL; in inno_hdmi_bind()
1174 hdmi->tmds_rate = clk_get_rate(hdmi->pclk); in inno_hdmi_bind()
1175 inno_hdmi_i2c_init(hdmi); in inno_hdmi_bind()
1177 ret = inno_hdmi_register(drm, hdmi); in inno_hdmi_bind()
1181 dev_set_drvdata(dev, hdmi); in inno_hdmi_bind()
1184 hdmi_modb(hdmi, HDMI_STATUS, m_MASK_INT_HOTPLUG, v_MASK_INT_HOTPLUG(1)); in inno_hdmi_bind()
1188 dev_name(dev), hdmi); in inno_hdmi_bind()
1190 dev_err(hdmi->dev, in inno_hdmi_bind()
1191 "failed to request hdmi irq: %d\n", ret); in inno_hdmi_bind()
1198 hdmi->connector.funcs->destroy(&hdmi->connector); in inno_hdmi_bind()
1199 hdmi->encoder.funcs->destroy(&hdmi->encoder); in inno_hdmi_bind()
1201 i2c_put_adapter(hdmi->ddc); in inno_hdmi_bind()
1203 clk_disable_unprepare(hdmi->pclk); in inno_hdmi_bind()
1205 clk_disable_unprepare(hdmi->aclk); in inno_hdmi_bind()
1212 struct inno_hdmi *hdmi = dev_get_drvdata(dev); in inno_hdmi_unbind() local
1214 hdmi->connector.funcs->destroy(&hdmi->connector); in inno_hdmi_unbind()
1215 hdmi->encoder.funcs->destroy(&hdmi->encoder); in inno_hdmi_unbind()
1217 i2c_put_adapter(hdmi->ddc); in inno_hdmi_unbind()
1218 clk_disable_unprepare(hdmi->pclk); in inno_hdmi_unbind()
1219 clk_disable_unprepare(hdmi->aclk); in inno_hdmi_unbind()