Lines Matching refs:hdmi
292 void (*write)(struct sh_hdmi *hdmi, u8 data, u8 reg);
293 u8 (*read)(struct sh_hdmi *hdmi, u8 reg);
298 static void __hdmi_write8(struct sh_hdmi *hdmi, u8 data, u8 reg) in __hdmi_write8() argument
300 iowrite8(data, hdmi->base + reg); in __hdmi_write8()
303 static u8 __hdmi_read8(struct sh_hdmi *hdmi, u8 reg) in __hdmi_read8() argument
305 return ioread8(hdmi->base + reg); in __hdmi_read8()
308 static void __hdmi_write32(struct sh_hdmi *hdmi, u8 data, u8 reg) in __hdmi_write32() argument
310 iowrite32((u32)data, hdmi->base + (reg * 4)); in __hdmi_write32()
314 static u8 __hdmi_read32(struct sh_hdmi *hdmi, u8 reg) in __hdmi_read32() argument
316 return (u8)ioread32(hdmi->base + (reg * 4)); in __hdmi_read32()
319 static void hdmi_write(struct sh_hdmi *hdmi, u8 data, u8 reg) in hdmi_write() argument
321 hdmi->write(hdmi, data, reg); in hdmi_write()
324 static u8 hdmi_read(struct sh_hdmi *hdmi, u8 reg) in hdmi_read() argument
326 return hdmi->read(hdmi, reg); in hdmi_read()
329 static void hdmi_bit_set(struct sh_hdmi *hdmi, u8 mask, u8 data, u8 reg) in hdmi_bit_set() argument
331 u8 val = hdmi_read(hdmi, reg); in hdmi_bit_set()
336 hdmi_write(hdmi, val, reg); in hdmi_bit_set()
339 static void hdmi_htop1_write(struct sh_hdmi *hdmi, u32 data, u32 reg) in hdmi_htop1_write() argument
341 iowrite32(data, hdmi->htop1 + reg); in hdmi_htop1_write()
345 static u32 hdmi_htop1_read(struct sh_hdmi *hdmi, u32 reg) in hdmi_htop1_read() argument
347 return ioread32(hdmi->htop1 + reg); in hdmi_htop1_read()
356 struct sh_hdmi *hdmi = snd_soc_codec_get_drvdata(codec); in sh_hdmi_snd_read() local
358 return hdmi_read(hdmi, reg); in sh_hdmi_snd_read()
365 struct sh_hdmi *hdmi = snd_soc_codec_get_drvdata(codec); in sh_hdmi_snd_write() local
367 hdmi_write(hdmi, value, reg); in sh_hdmi_snd_write()
403 static void sh_hdmi_external_video_param(struct sh_hdmi *hdmi) in sh_hdmi_external_video_param() argument
405 struct fb_videomode *mode = &hdmi->mode; in sh_hdmi_external_video_param()
435 dev_dbg(hdmi->dev, "H: %u, %u, %u, %u; V: %u, %u, %u, %u; sync 0x%x\n", in sh_hdmi_external_video_param()
439 hdmi_write(hdmi, sync | (voffset << 4), HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS); in sh_hdmi_external_video_param()
441 hdmi_write(hdmi, htotal, HDMI_EXTERNAL_H_TOTAL_7_0); in sh_hdmi_external_video_param()
442 hdmi_write(hdmi, htotal >> 8, HDMI_EXTERNAL_H_TOTAL_11_8); in sh_hdmi_external_video_param()
444 hdmi_write(hdmi, hblank, HDMI_EXTERNAL_H_BLANK_7_0); in sh_hdmi_external_video_param()
445 hdmi_write(hdmi, hblank >> 8, HDMI_EXTERNAL_H_BLANK_9_8); in sh_hdmi_external_video_param()
447 hdmi_write(hdmi, hdelay, HDMI_EXTERNAL_H_DELAY_7_0); in sh_hdmi_external_video_param()
448 hdmi_write(hdmi, hdelay >> 8, HDMI_EXTERNAL_H_DELAY_9_8); in sh_hdmi_external_video_param()
450 hdmi_write(hdmi, mode->hsync_len, HDMI_EXTERNAL_H_DURATION_7_0); in sh_hdmi_external_video_param()
451 hdmi_write(hdmi, mode->hsync_len >> 8, HDMI_EXTERNAL_H_DURATION_9_8); in sh_hdmi_external_video_param()
453 hdmi_write(hdmi, vtotal, HDMI_EXTERNAL_V_TOTAL_7_0); in sh_hdmi_external_video_param()
454 hdmi_write(hdmi, vtotal >> 8, HDMI_EXTERNAL_V_TOTAL_9_8); in sh_hdmi_external_video_param()
456 hdmi_write(hdmi, vblank, HDMI_EXTERNAL_V_BLANK); in sh_hdmi_external_video_param()
458 hdmi_write(hdmi, vdelay, HDMI_EXTERNAL_V_DELAY); in sh_hdmi_external_video_param()
460 hdmi_write(hdmi, mode->vsync_len, HDMI_EXTERNAL_V_DURATION); in sh_hdmi_external_video_param()
463 if (!hdmi->preprogrammed_vic) in sh_hdmi_external_video_param()
464 hdmi_write(hdmi, sync | 1 | (voffset << 4), in sh_hdmi_external_video_param()
471 static void sh_hdmi_video_config(struct sh_hdmi *hdmi) in sh_hdmi_video_config() argument
478 hdmi_write(hdmi, 0x20, HDMI_AUDIO_VIDEO_SETTING_1); in sh_hdmi_video_config()
486 hdmi_write(hdmi, 0x34, HDMI_VIDEO_SETTING_1); in sh_hdmi_video_config()
493 hdmi_write(hdmi, 0x20, HDMI_DEEP_COLOR_MODES); in sh_hdmi_video_config()
499 static void sh_hdmi_audio_config(struct sh_hdmi *hdmi) in sh_hdmi_audio_config() argument
502 struct sh_mobile_hdmi_info *pdata = dev_get_platdata(hdmi->dev); in sh_hdmi_audio_config()
508 hdmi_write(hdmi, 0x00, HDMI_L_R_DATA_SWAP_CTRL_RPKT); in sh_hdmi_audio_config()
510 hdmi_write(hdmi, 0x18, HDMI_20_BIT_N_FOR_AUDIO_RPKT_15_8); in sh_hdmi_audio_config()
512 hdmi_write(hdmi, 0x00, HDMI_20_BIT_N_FOR_AUDIO_RPKT_7_0); in sh_hdmi_audio_config()
515 hdmi_write(hdmi, 0x20, HDMI_SPDIF_AUDIO_SAMP_FREQ_CTS); in sh_hdmi_audio_config()
537 hdmi_write(hdmi, data, HDMI_AUDIO_SETTING_1); in sh_hdmi_audio_config()
540 hdmi_write(hdmi, 0x40, HDMI_AUDIO_SETTING_2); in sh_hdmi_audio_config()
546 hdmi_write(hdmi, 0x04, HDMI_I2S_AUDIO_SET); in sh_hdmi_audio_config()
549 hdmi_write(hdmi, 0x00, HDMI_DSD_AUDIO_SET); in sh_hdmi_audio_config()
552 hdmi_write(hdmi, 0x00, HDMI_I2S_INPUT_PIN_SWAP); in sh_hdmi_audio_config()
558 hdmi_write(hdmi, 0x00, HDMI_AUDIO_STATUS_BITS_SETTING_1); in sh_hdmi_audio_config()
567 hdmi_write(hdmi, 0x00, HDMI_AUDIO_STATUS_BITS_SETTING_2); in sh_hdmi_audio_config()
570 hdmi_write(hdmi, 0x00, HDMI_CATEGORY_CODE); in sh_hdmi_audio_config()
576 hdmi_write(hdmi, 0x00, HDMI_SOURCE_NUM_AUDIO_WORD_LEN); in sh_hdmi_audio_config()
579 hdmi_write(hdmi, 0x20, HDMI_AUDIO_VIDEO_SETTING_1); in sh_hdmi_audio_config()
585 static void sh_hdmi_phy_config(struct sh_hdmi *hdmi) in sh_hdmi_phy_config() argument
587 if (hdmi->mode.pixclock < 10000) { in sh_hdmi_phy_config()
589 hdmi_write(hdmi, 0x1d, HDMI_SLIPHDMIT_PARAM_SETTINGS_1); in sh_hdmi_phy_config()
590 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_2); in sh_hdmi_phy_config()
591 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_3); in sh_hdmi_phy_config()
592 hdmi_write(hdmi, 0x4c, HDMI_SLIPHDMIT_PARAM_SETTINGS_5); in sh_hdmi_phy_config()
593 hdmi_write(hdmi, 0x1e, HDMI_SLIPHDMIT_PARAM_SETTINGS_6); in sh_hdmi_phy_config()
594 hdmi_write(hdmi, 0x48, HDMI_SLIPHDMIT_PARAM_SETTINGS_7); in sh_hdmi_phy_config()
595 hdmi_write(hdmi, 0x0e, HDMI_SLIPHDMIT_PARAM_SETTINGS_8); in sh_hdmi_phy_config()
596 hdmi_write(hdmi, 0x25, HDMI_SLIPHDMIT_PARAM_SETTINGS_9); in sh_hdmi_phy_config()
597 hdmi_write(hdmi, 0x04, HDMI_SLIPHDMIT_PARAM_SETTINGS_10); in sh_hdmi_phy_config()
598 } else if (hdmi->mode.pixclock < 30000) { in sh_hdmi_phy_config()
607 hdmi_write(hdmi, 0x0f, HDMI_SLIPHDMIT_PARAM_SETTINGS_1); in sh_hdmi_phy_config()
609 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_2); in sh_hdmi_phy_config()
614 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_3); in sh_hdmi_phy_config()
616 hdmi_write(hdmi, 0x44, HDMI_SLIPHDMIT_PARAM_SETTINGS_5); in sh_hdmi_phy_config()
621 hdmi_write(hdmi, 0x32, HDMI_SLIPHDMIT_PARAM_SETTINGS_6); in sh_hdmi_phy_config()
623 hdmi_write(hdmi, 0x4A, HDMI_SLIPHDMIT_PARAM_SETTINGS_7); in sh_hdmi_phy_config()
628 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_8); in sh_hdmi_phy_config()
630 hdmi_write(hdmi, 0x25, HDMI_SLIPHDMIT_PARAM_SETTINGS_9); in sh_hdmi_phy_config()
636 hdmi_write(hdmi, 0x04, HDMI_SLIPHDMIT_PARAM_SETTINGS_10); in sh_hdmi_phy_config()
639 hdmi_write(hdmi, 0x19, HDMI_SLIPHDMIT_PARAM_SETTINGS_1); in sh_hdmi_phy_config()
640 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_2); in sh_hdmi_phy_config()
641 hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_3); in sh_hdmi_phy_config()
642 hdmi_write(hdmi, 0x44, HDMI_SLIPHDMIT_PARAM_SETTINGS_5); in sh_hdmi_phy_config()
643 hdmi_write(hdmi, 0x32, HDMI_SLIPHDMIT_PARAM_SETTINGS_6); in sh_hdmi_phy_config()
644 hdmi_write(hdmi, 0x48, HDMI_SLIPHDMIT_PARAM_SETTINGS_7); in sh_hdmi_phy_config()
645 hdmi_write(hdmi, 0x0F, HDMI_SLIPHDMIT_PARAM_SETTINGS_8); in sh_hdmi_phy_config()
646 hdmi_write(hdmi, 0x20, HDMI_SLIPHDMIT_PARAM_SETTINGS_9); in sh_hdmi_phy_config()
647 hdmi_write(hdmi, 0x04, HDMI_SLIPHDMIT_PARAM_SETTINGS_10); in sh_hdmi_phy_config()
654 static void sh_hdmi_avi_infoframe_setup(struct sh_hdmi *hdmi) in sh_hdmi_avi_infoframe_setup() argument
659 hdmi_write(hdmi, 0x06, HDMI_CTRL_PKT_BUF_INDEX); in sh_hdmi_avi_infoframe_setup()
662 hdmi_write(hdmi, 0x82, HDMI_CTRL_PKT_BUF_ACCESS_HB0); in sh_hdmi_avi_infoframe_setup()
665 hdmi_write(hdmi, 0x02, HDMI_CTRL_PKT_BUF_ACCESS_HB1); in sh_hdmi_avi_infoframe_setup()
668 hdmi_write(hdmi, 0x0D, HDMI_CTRL_PKT_BUF_ACCESS_HB2); in sh_hdmi_avi_infoframe_setup()
671 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB0); in sh_hdmi_avi_infoframe_setup()
679 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB1); in sh_hdmi_avi_infoframe_setup()
686 hdmi_write(hdmi, 0x28, HDMI_CTRL_PKT_BUF_ACCESS_PB2); in sh_hdmi_avi_infoframe_setup()
694 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB3); in sh_hdmi_avi_infoframe_setup()
700 if (hdmi->preprogrammed_vic) in sh_hdmi_avi_infoframe_setup()
701 vic = hdmi->preprogrammed_vic; in sh_hdmi_avi_infoframe_setup()
704 hdmi_write(hdmi, vic, HDMI_CTRL_PKT_BUF_ACCESS_PB4); in sh_hdmi_avi_infoframe_setup()
707 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB5); in sh_hdmi_avi_infoframe_setup()
710 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB6); in sh_hdmi_avi_infoframe_setup()
713 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB7); in sh_hdmi_avi_infoframe_setup()
716 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB8); in sh_hdmi_avi_infoframe_setup()
719 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB9); in sh_hdmi_avi_infoframe_setup()
722 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB10); in sh_hdmi_avi_infoframe_setup()
725 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB11); in sh_hdmi_avi_infoframe_setup()
728 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB12); in sh_hdmi_avi_infoframe_setup()
731 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB13); in sh_hdmi_avi_infoframe_setup()
737 static void sh_hdmi_audio_infoframe_setup(struct sh_hdmi *hdmi) in sh_hdmi_audio_infoframe_setup() argument
740 hdmi_write(hdmi, 0x08, HDMI_CTRL_PKT_BUF_INDEX); in sh_hdmi_audio_infoframe_setup()
743 hdmi_write(hdmi, 0x84, HDMI_CTRL_PKT_BUF_ACCESS_HB0); in sh_hdmi_audio_infoframe_setup()
746 hdmi_write(hdmi, 0x01, HDMI_CTRL_PKT_BUF_ACCESS_HB1); in sh_hdmi_audio_infoframe_setup()
749 hdmi_write(hdmi, 0x0A, HDMI_CTRL_PKT_BUF_ACCESS_HB2); in sh_hdmi_audio_infoframe_setup()
752 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB0); in sh_hdmi_audio_infoframe_setup()
755 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB1); in sh_hdmi_audio_infoframe_setup()
758 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB2); in sh_hdmi_audio_infoframe_setup()
761 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB3); in sh_hdmi_audio_infoframe_setup()
764 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB4); in sh_hdmi_audio_infoframe_setup()
767 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB5); in sh_hdmi_audio_infoframe_setup()
770 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB6); in sh_hdmi_audio_infoframe_setup()
771 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB7); in sh_hdmi_audio_infoframe_setup()
772 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB8); in sh_hdmi_audio_infoframe_setup()
773 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB9); in sh_hdmi_audio_infoframe_setup()
774 hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB10); in sh_hdmi_audio_infoframe_setup()
780 static void sh_hdmi_configure(struct sh_hdmi *hdmi) in sh_hdmi_configure() argument
783 sh_hdmi_video_config(hdmi); in sh_hdmi_configure()
786 sh_hdmi_audio_config(hdmi); in sh_hdmi_configure()
789 sh_hdmi_phy_config(hdmi); in sh_hdmi_configure()
792 sh_hdmi_avi_infoframe_setup(hdmi); in sh_hdmi_configure()
795 sh_hdmi_audio_infoframe_setup(hdmi); in sh_hdmi_configure()
801 hdmi_write(hdmi, 0x8E, HDMI_CTRL_PKT_AUTO_SEND); in sh_hdmi_configure()
807 hdmi_bit_set(hdmi, 0xFC, 0x4C, HDMI_SYSTEM_CTRL); in sh_hdmi_configure()
811 hdmi_bit_set(hdmi, 0xFC, 0x40, HDMI_SYSTEM_CTRL); in sh_hdmi_configure()
814 static unsigned long sh_hdmi_rate_error(struct sh_hdmi *hdmi, in sh_hdmi_rate_error() argument
819 struct sh_mobile_hdmi_info *pdata = dev_get_platdata(hdmi->dev); in sh_hdmi_rate_error()
821 *hdmi_rate = clk_round_rate(hdmi->hdmi_clk, target); in sh_hdmi_rate_error()
823 *hdmi_rate = clk_get_rate(hdmi->hdmi_clk); in sh_hdmi_rate_error()
828 else if (clk_get_parent(hdmi->hdmi_clk)) in sh_hdmi_rate_error()
829 *parent_rate = clk_get_rate(clk_get_parent(hdmi->hdmi_clk)); in sh_hdmi_rate_error()
831 dev_dbg(hdmi->dev, "%u-%u-%u-%u x %u-%u-%u-%u\n", in sh_hdmi_rate_error()
837 dev_dbg(hdmi->dev, "\t@%lu(+/-%lu)Hz, e=%lu / 1000, r=%uHz, p=%luHz\n", target, in sh_hdmi_rate_error()
844 static int sh_hdmi_read_edid(struct sh_hdmi *hdmi, unsigned long *hdmi_rate, in sh_hdmi_read_edid() argument
847 struct sh_mobile_lcdc_chan *ch = hdmi->entity.lcdc; in sh_hdmi_read_edid()
858 dev_dbg(hdmi->dev, "Read back EDID code:"); in sh_hdmi_read_edid()
860 edid[i] = (hdmi->htop1) ? in sh_hdmi_read_edid()
861 (u8)hdmi_htop1_read(hdmi, HDMI_HTOP1_EDID_DATA_READ + (i * 4)) : in sh_hdmi_read_edid()
862 hdmi_read(hdmi, HDMI_EDID_KSV_FIFO_ACCESS_WINDOW); in sh_hdmi_read_edid()
876 if (!hdmi->edid_blocks) { in sh_hdmi_read_edid()
877 fb_edid_to_monspecs(edid, &hdmi->monspec); in sh_hdmi_read_edid()
878 hdmi->edid_blocks = edid[126] + 1; in sh_hdmi_read_edid()
880 dev_dbg(hdmi->dev, "%d main modes, %d extension blocks\n", in sh_hdmi_read_edid()
881 hdmi->monspec.modedb_len, hdmi->edid_blocks - 1); in sh_hdmi_read_edid()
883 dev_dbg(hdmi->dev, "Extension %u detected, DTD start %u\n", in sh_hdmi_read_edid()
885 fb_edid_add_monspecs(edid, &hdmi->monspec); in sh_hdmi_read_edid()
888 if (hdmi->edid_blocks > hdmi->edid_segment_nr * 2 + in sh_hdmi_read_edid()
889 (hdmi->edid_block_addr >> 7) + 1) { in sh_hdmi_read_edid()
891 if (hdmi->edid_block_addr) { in sh_hdmi_read_edid()
892 hdmi->edid_block_addr = 0; in sh_hdmi_read_edid()
893 hdmi->edid_segment_nr++; in sh_hdmi_read_edid()
895 hdmi->edid_block_addr = 0x80; in sh_hdmi_read_edid()
898 hdmi_write(hdmi, hdmi->edid_block_addr, HDMI_EDID_WORD_ADDRESS); in sh_hdmi_read_edid()
900 hdmi_write(hdmi, 0xC6, HDMI_INTERRUPT_MASK_1); in sh_hdmi_read_edid()
902 hdmi_write(hdmi, hdmi->edid_segment_nr, HDMI_EDID_SEGMENT_POINTER); in sh_hdmi_read_edid()
907 dev_dbg(hdmi->dev, "%d main and extended modes\n", hdmi->monspec.modedb_len); in sh_hdmi_read_edid()
921 dev_dbg(hdmi->dev, "Forced mode %ux%u@%uHz\n", in sh_hdmi_read_edid()
926 for (i = 0, mode = hdmi->monspec.modedb; in sh_hdmi_read_edid()
927 i < hdmi->monspec.modedb_len && scanning; in sh_hdmi_read_edid()
947 rate_error = sh_hdmi_rate_error(hdmi, mode, hdmi_rate, parent_rate); in sh_hdmi_read_edid()
988 if (!found && hdmi->entity.def_mode.xres != 0) { in sh_hdmi_read_edid()
989 found = &hdmi->entity.def_mode; in sh_hdmi_read_edid()
990 found_rate_error = sh_hdmi_rate_error(hdmi, found, hdmi_rate, in sh_hdmi_read_edid()
999 hdmi->preprogrammed_vic = 1; in sh_hdmi_read_edid()
1001 hdmi->preprogrammed_vic = 2; in sh_hdmi_read_edid()
1003 hdmi->preprogrammed_vic = 17; in sh_hdmi_read_edid()
1005 hdmi->preprogrammed_vic = 4; in sh_hdmi_read_edid()
1007 hdmi->preprogrammed_vic = 32; in sh_hdmi_read_edid()
1009 hdmi->preprogrammed_vic = 31; in sh_hdmi_read_edid()
1011 hdmi->preprogrammed_vic = 16; in sh_hdmi_read_edid()
1013 hdmi->preprogrammed_vic = 0; in sh_hdmi_read_edid()
1015 dev_dbg(hdmi->dev, "Using %s %s mode %ux%u@%uHz (%luHz), " in sh_hdmi_read_edid()
1017 hdmi->preprogrammed_vic ? "VIC" : "external", found->xres, in sh_hdmi_read_edid()
1021 hdmi->mode = *found; in sh_hdmi_read_edid()
1022 sh_hdmi_external_video_param(hdmi); in sh_hdmi_read_edid()
1029 struct sh_hdmi *hdmi = dev_id; in sh_hdmi_hotplug() local
1033 hdmi_bit_set(hdmi, 0xFC, 0x2C, HDMI_SYSTEM_CTRL); in sh_hdmi_hotplug()
1039 hdmi_bit_set(hdmi, 0xFC, 0x20, HDMI_SYSTEM_CTRL); in sh_hdmi_hotplug()
1041 status1 = hdmi_read(hdmi, HDMI_INTERRUPT_STATUS_1); in sh_hdmi_hotplug()
1042 status2 = hdmi_read(hdmi, HDMI_INTERRUPT_STATUS_2); in sh_hdmi_hotplug()
1044 mask1 = hdmi_read(hdmi, HDMI_INTERRUPT_MASK_1); in sh_hdmi_hotplug()
1045 mask2 = hdmi_read(hdmi, HDMI_INTERRUPT_MASK_2); in sh_hdmi_hotplug()
1048 hdmi_write(hdmi, 0xFF, HDMI_INTERRUPT_STATUS_1); in sh_hdmi_hotplug()
1049 hdmi_write(hdmi, 0xFF, HDMI_INTERRUPT_STATUS_2); in sh_hdmi_hotplug()
1052 dev_dbg(hdmi->dev, "IRQ #%d: Status #1: 0x%x & 0x%x, #2: 0x%x & 0x%x\n", in sh_hdmi_hotplug()
1063 msens = hdmi_read(hdmi, HDMI_HOT_PLUG_MSENS_STATUS); in sh_hdmi_hotplug()
1064 dev_dbg(hdmi->dev, "MSENS 0x%x\n", msens); in sh_hdmi_hotplug()
1068 hdmi->edid_segment_nr = 0; in sh_hdmi_hotplug()
1069 hdmi->edid_block_addr = 0; in sh_hdmi_hotplug()
1070 hdmi->edid_blocks = 0; in sh_hdmi_hotplug()
1071 hdmi->hp_state = HDMI_HOTPLUG_CONNECTED; in sh_hdmi_hotplug()
1074 hdmi_write(hdmi, 0x00, HDMI_EDID_WORD_ADDRESS); in sh_hdmi_hotplug()
1076 hdmi_write(hdmi, 0xC6, HDMI_INTERRUPT_MASK_1); in sh_hdmi_hotplug()
1078 hdmi_write(hdmi, 0x00, HDMI_EDID_SEGMENT_POINTER); in sh_hdmi_hotplug()
1081 if (hdmi->hp_state != HDMI_HOTPLUG_DISCONNECTED) { in sh_hdmi_hotplug()
1082 hdmi->hp_state = HDMI_HOTPLUG_DISCONNECTED; in sh_hdmi_hotplug()
1083 schedule_delayed_work(&hdmi->edid_work, 0); in sh_hdmi_hotplug()
1090 hdmi_write(hdmi, hdmi->edid_block_addr, HDMI_EDID_WORD_ADDRESS); in sh_hdmi_hotplug()
1092 hdmi_write(hdmi, hdmi->edid_segment_nr, HDMI_EDID_SEGMENT_POINTER); in sh_hdmi_hotplug()
1095 hdmi_write(hdmi, 0xC0, HDMI_INTERRUPT_MASK_1); in sh_hdmi_hotplug()
1096 schedule_delayed_work(&hdmi->edid_work, msecs_to_jiffies(10)); in sh_hdmi_hotplug()
1104 struct sh_hdmi *hdmi = entity_to_sh_hdmi(entity); in sh_hdmi_display_on() local
1106 dev_dbg(hdmi->dev, "%s(%p): state %x\n", __func__, hdmi, in sh_hdmi_display_on()
1107 hdmi->hp_state); in sh_hdmi_display_on()
1115 if (hdmi->hp_state == HDMI_HOTPLUG_EDID_DONE) { in sh_hdmi_display_on()
1117 hdmi_bit_set(hdmi, 0xFC, 0x80, HDMI_SYSTEM_CTRL); in sh_hdmi_display_on()
1118 dev_dbg(hdmi->dev, "HDMI running\n"); in sh_hdmi_display_on()
1121 return hdmi->hp_state == HDMI_HOTPLUG_DISCONNECTED in sh_hdmi_display_on()
1128 struct sh_hdmi *hdmi = entity_to_sh_hdmi(entity); in sh_hdmi_display_off() local
1130 dev_dbg(hdmi->dev, "%s(%p)\n", __func__, hdmi); in sh_hdmi_display_off()
1132 hdmi_bit_set(hdmi, 0xFC, 0x10, HDMI_SYSTEM_CTRL); in sh_hdmi_display_off()
1149 static long sh_hdmi_clk_configure(struct sh_hdmi *hdmi, unsigned long hdmi_rate, in sh_hdmi_clk_configure() argument
1154 if (parent_rate && clk_get_parent(hdmi->hdmi_clk)) { in sh_hdmi_clk_configure()
1155 ret = clk_set_rate(clk_get_parent(hdmi->hdmi_clk), parent_rate); in sh_hdmi_clk_configure()
1157 dev_warn(hdmi->dev, "Cannot set parent rate %ld: %d\n", parent_rate, ret); in sh_hdmi_clk_configure()
1158 hdmi_rate = clk_round_rate(hdmi->hdmi_clk, hdmi_rate); in sh_hdmi_clk_configure()
1160 dev_dbg(hdmi->dev, "HDMI set parent frequency %lu\n", parent_rate); in sh_hdmi_clk_configure()
1164 ret = clk_set_rate(hdmi->hdmi_clk, hdmi_rate); in sh_hdmi_clk_configure()
1166 dev_warn(hdmi->dev, "Cannot set rate %ld: %d\n", hdmi_rate, ret); in sh_hdmi_clk_configure()
1169 dev_dbg(hdmi->dev, "HDMI set frequency %lu\n", hdmi_rate); in sh_hdmi_clk_configure()
1178 struct sh_hdmi *hdmi = container_of(work, struct sh_hdmi, edid_work.work); in sh_hdmi_edid_work_fn() local
1179 struct sh_mobile_lcdc_chan *ch = hdmi->entity.lcdc; in sh_hdmi_edid_work_fn()
1182 dev_dbg(hdmi->dev, "%s(%p): begin, hotplug status %d\n", __func__, hdmi, in sh_hdmi_edid_work_fn()
1183 hdmi->hp_state); in sh_hdmi_edid_work_fn()
1185 if (hdmi->hp_state == HDMI_HOTPLUG_CONNECTED) { in sh_hdmi_edid_work_fn()
1188 ret = sh_hdmi_read_edid(hdmi, &hdmi_rate, &parent_rate); in sh_hdmi_edid_work_fn()
1192 hdmi->hp_state = HDMI_HOTPLUG_EDID_DONE; in sh_hdmi_edid_work_fn()
1195 ret = sh_hdmi_clk_configure(hdmi, hdmi_rate, parent_rate); in sh_hdmi_edid_work_fn()
1200 sh_hdmi_configure(hdmi); in sh_hdmi_edid_work_fn()
1206 &hdmi->mode, &hdmi->monspec); in sh_hdmi_edid_work_fn()
1208 hdmi->monspec.modedb_len = 0; in sh_hdmi_edid_work_fn()
1209 fb_destroy_modedb(hdmi->monspec.modedb); in sh_hdmi_edid_work_fn()
1210 hdmi->monspec.modedb = NULL; in sh_hdmi_edid_work_fn()
1221 hdmi->hp_state = HDMI_HOTPLUG_DISCONNECTED; in sh_hdmi_edid_work_fn()
1223 dev_dbg(hdmi->dev, "%s(%p): end\n", __func__, hdmi); in sh_hdmi_edid_work_fn()
1226 static void sh_hdmi_htop1_init(struct sh_hdmi *hdmi) in sh_hdmi_htop1_init() argument
1228 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_MODE); in sh_hdmi_htop1_init()
1229 hdmi_htop1_write(hdmi, 0x0000000b, 0x0010); in sh_hdmi_htop1_init()
1230 hdmi_htop1_write(hdmi, 0x00006710, HDMI_HTOP1_HTOP_DCL_FRC_MODE); in sh_hdmi_htop1_init()
1231 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y1_1); in sh_hdmi_htop1_init()
1232 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y1_2); in sh_hdmi_htop1_init()
1233 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB1_1); in sh_hdmi_htop1_init()
1234 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB1_2); in sh_hdmi_htop1_init()
1235 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR1_1); in sh_hdmi_htop1_init()
1236 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR1_2); in sh_hdmi_htop1_init()
1237 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y2_1); in sh_hdmi_htop1_init()
1238 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y2_2); in sh_hdmi_htop1_init()
1239 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB2_1); in sh_hdmi_htop1_init()
1240 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB2_2); in sh_hdmi_htop1_init()
1241 hdmi_htop1_write(hdmi, 0x01020406, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR2_1); in sh_hdmi_htop1_init()
1242 hdmi_htop1_write(hdmi, 0x07080806, HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR2_2); in sh_hdmi_htop1_init()
1243 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_Y1); in sh_hdmi_htop1_init()
1244 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_CB1); in sh_hdmi_htop1_init()
1245 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_CR1); in sh_hdmi_htop1_init()
1246 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_Y2); in sh_hdmi_htop1_init()
1247 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_CB2); in sh_hdmi_htop1_init()
1248 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_HTOP_DCL_COR_PARA_CR2); in sh_hdmi_htop1_init()
1249 hdmi_htop1_write(hdmi, 0x00000008, HDMI_HTOP1_CURRENT); in sh_hdmi_htop1_init()
1250 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_TISEMP0_1); in sh_hdmi_htop1_init()
1251 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_TISEMP2_C); in sh_hdmi_htop1_init()
1252 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_PHY_TEST_MODE); in sh_hdmi_htop1_init()
1253 hdmi_htop1_write(hdmi, 0x00000081, HDMI_HTOP1_TISIDRV); in sh_hdmi_htop1_init()
1254 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_PLLBW); in sh_hdmi_htop1_init()
1255 hdmi_htop1_write(hdmi, 0x0000000f, HDMI_HTOP1_TISEN); in sh_hdmi_htop1_init()
1256 hdmi_htop1_write(hdmi, 0x0000000f, HDMI_HTOP1_TISDREN); in sh_hdmi_htop1_init()
1257 hdmi_htop1_write(hdmi, 0x00000003, HDMI_HTOP1_ENABLE_SELECTOR); in sh_hdmi_htop1_init()
1258 hdmi_htop1_write(hdmi, 0x00000001, HDMI_HTOP1_MACRO_RESET); in sh_hdmi_htop1_init()
1259 hdmi_htop1_write(hdmi, 0x00000016, HDMI_HTOP1_CISRANGE); in sh_hdmi_htop1_init()
1261 hdmi_htop1_write(hdmi, 0x00000001, HDMI_HTOP1_ENABLE_SELECTOR); in sh_hdmi_htop1_init()
1263 hdmi_htop1_write(hdmi, 0x00000003, HDMI_HTOP1_ENABLE_SELECTOR); in sh_hdmi_htop1_init()
1264 hdmi_htop1_write(hdmi, 0x00000001, HDMI_HTOP1_MACRO_RESET); in sh_hdmi_htop1_init()
1265 hdmi_htop1_write(hdmi, 0x0000000f, HDMI_HTOP1_TISEN); in sh_hdmi_htop1_init()
1266 hdmi_htop1_write(hdmi, 0x0000000f, HDMI_HTOP1_TISDREN); in sh_hdmi_htop1_init()
1267 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_VIDEO_INPUT); in sh_hdmi_htop1_init()
1268 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_CLK_TO_PHY); in sh_hdmi_htop1_init()
1269 hdmi_htop1_write(hdmi, 0x00000000, HDMI_HTOP1_VIDEO_INPUT2); in sh_hdmi_htop1_init()
1270 hdmi_htop1_write(hdmi, 0x0000000a, HDMI_HTOP1_CLK_SET); in sh_hdmi_htop1_init()
1279 struct sh_hdmi *hdmi; in sh_hdmi_probe() local
1294 hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); in sh_hdmi_probe()
1295 if (!hdmi) { in sh_hdmi_probe()
1300 hdmi->dev = &pdev->dev; in sh_hdmi_probe()
1301 hdmi->entity.owner = THIS_MODULE; in sh_hdmi_probe()
1302 hdmi->entity.ops = &sh_hdmi_ops; in sh_hdmi_probe()
1303 hdmi->irq = irq; in sh_hdmi_probe()
1305 hdmi->hdmi_clk = clk_get(&pdev->dev, "ick"); in sh_hdmi_probe()
1306 if (IS_ERR(hdmi->hdmi_clk)) { in sh_hdmi_probe()
1307 ret = PTR_ERR(hdmi->hdmi_clk); in sh_hdmi_probe()
1314 hdmi->write = __hdmi_write32; in sh_hdmi_probe()
1315 hdmi->read = __hdmi_read32; in sh_hdmi_probe()
1317 hdmi->write = __hdmi_write8; in sh_hdmi_probe()
1318 hdmi->read = __hdmi_read8; in sh_hdmi_probe()
1322 rate = clk_round_rate(hdmi->hdmi_clk, PICOS2KHZ(37037)); in sh_hdmi_probe()
1324 rate = sh_hdmi_clk_configure(hdmi, rate, 0); in sh_hdmi_probe()
1331 ret = clk_prepare_enable(hdmi->hdmi_clk); in sh_hdmi_probe()
1333 dev_err(hdmi->dev, "Cannot enable clock: %d\n", ret); in sh_hdmi_probe()
1345 hdmi->base = ioremap(res->start, resource_size(res)); in sh_hdmi_probe()
1346 if (!hdmi->base) { in sh_hdmi_probe()
1352 platform_set_drvdata(pdev, &hdmi->entity); in sh_hdmi_probe()
1354 INIT_DELAYED_WORK(&hdmi->edid_work, sh_hdmi_edid_work_fn); in sh_hdmi_probe()
1361 hdmi_bit_set(hdmi, 0x02, 0x02, HDMI_SYSTEM_CTRL); in sh_hdmi_probe()
1364 hdmi_bit_set(hdmi, 0x01, 0x01, HDMI_SYSTEM_CTRL); in sh_hdmi_probe()
1368 hdmi->htop1 = ioremap(htop1_res->start, resource_size(htop1_res)); in sh_hdmi_probe()
1369 if (!hdmi->htop1) { in sh_hdmi_probe()
1374 sh_hdmi_htop1_init(hdmi); in sh_hdmi_probe()
1379 hdmi_read(hdmi, HDMI_PRODUCT_ID), hdmi_read(hdmi, HDMI_REVISION_ID)); in sh_hdmi_probe()
1382 dev_name(&pdev->dev), hdmi); in sh_hdmi_probe()
1398 free_irq(irq, hdmi); in sh_hdmi_probe()
1400 if (hdmi->htop1) in sh_hdmi_probe()
1401 iounmap(hdmi->htop1); in sh_hdmi_probe()
1405 iounmap(hdmi->base); in sh_hdmi_probe()
1409 clk_disable_unprepare(hdmi->hdmi_clk); in sh_hdmi_probe()
1411 clk_put(hdmi->hdmi_clk); in sh_hdmi_probe()
1418 struct sh_hdmi *hdmi = entity_to_sh_hdmi(platform_get_drvdata(pdev)); in sh_hdmi_remove() local
1424 free_irq(hdmi->irq, hdmi); in sh_hdmi_remove()
1426 cancel_delayed_work_sync(&hdmi->edid_work); in sh_hdmi_remove()
1429 clk_disable_unprepare(hdmi->hdmi_clk); in sh_hdmi_remove()
1430 clk_put(hdmi->hdmi_clk); in sh_hdmi_remove()
1431 if (hdmi->htop1) in sh_hdmi_remove()
1432 iounmap(hdmi->htop1); in sh_hdmi_remove()
1433 iounmap(hdmi->base); in sh_hdmi_remove()
1442 struct sh_hdmi *hdmi = entity_to_sh_hdmi(platform_get_drvdata(pdev)); in sh_hdmi_suspend() local
1444 disable_irq(hdmi->irq); in sh_hdmi_suspend()
1446 cancel_delayed_work_sync(&hdmi->edid_work); in sh_hdmi_suspend()
1454 struct sh_hdmi *hdmi = entity_to_sh_hdmi(platform_get_drvdata(pdev)); in sh_hdmi_resume() local
1458 hdmi_bit_set(hdmi, 0x02, 0x02, HDMI_SYSTEM_CTRL); in sh_hdmi_resume()
1461 hdmi_bit_set(hdmi, 0x01, 0x01, HDMI_SYSTEM_CTRL); in sh_hdmi_resume()
1464 if (hdmi->htop1) in sh_hdmi_resume()
1465 sh_hdmi_htop1_init(hdmi); in sh_hdmi_resume()
1468 enable_irq(hdmi->irq); in sh_hdmi_resume()