Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next

Just refactoring HDMI driver by using infoframe helper
function, fixing GSC Kconfig dependency issue and including trivial
cleanups.

* 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos:
drm/exynos: Use VIDEO_SAMSUNG_EXYNOS_GSC=n as GSC Kconfig dependency
drm/exynos: gsc: fix spelling mistakes
exynos-drm: Fix error messages to print flags and size
drm/exynos/hdmi: refactor infoframe code

+47 -106
+1 -1
drivers/gpu/drm/exynos/Kconfig
··· 114 114 115 115 config DRM_EXYNOS_GSC 116 116 bool "GScaler" 117 - depends on DRM_EXYNOS_IPP && ARCH_EXYNOS5 && !VIDEO_SAMSUNG_EXYNOS_GSC 117 + depends on DRM_EXYNOS_IPP && ARCH_EXYNOS5 && VIDEO_SAMSUNG_EXYNOS_GSC=n 118 118 help 119 119 Choose this option if you want to use Exynos GSC for DRM. 120 120
+1 -1
drivers/gpu/drm/exynos/exynos_drm_fimc.c
··· 1433 1433 &img_pos[EXYNOS_DRM_OPS_SRC], 1434 1434 &img_pos[EXYNOS_DRM_OPS_DST]); 1435 1435 if (ret) { 1436 - dev_err(dev, "failed to set precalser.\n"); 1436 + dev_err(dev, "failed to set prescaler.\n"); 1437 1437 return ret; 1438 1438 } 1439 1439
+2 -2
drivers/gpu/drm/exynos/exynos_drm_gem.c
··· 231 231 int ret; 232 232 233 233 if (flags & ~(EXYNOS_BO_MASK)) { 234 - DRM_ERROR("invalid flags.\n"); 234 + DRM_ERROR("invalid GEM buffer flags: %u\n", flags); 235 235 return ERR_PTR(-EINVAL); 236 236 } 237 237 238 238 if (!size) { 239 - DRM_ERROR("invalid size.\n"); 239 + DRM_ERROR("invalid GEM buffer size: %lu\n", size); 240 240 return ERR_PTR(-EINVAL); 241 241 } 242 242
+1 -1
drivers/gpu/drm/exynos/exynos_drm_gsc.c
··· 1610 1610 &img_pos[EXYNOS_DRM_OPS_SRC], 1611 1611 &img_pos[EXYNOS_DRM_OPS_DST]); 1612 1612 if (ret) { 1613 - dev_err(dev, "failed to set precalser.\n"); 1613 + dev_err(dev, "failed to set prescaler.\n"); 1614 1614 return ret; 1615 1615 } 1616 1616
+40 -101
drivers/gpu/drm/exynos/exynos_hdmi.c
··· 47 47 48 48 #define HOTPLUG_DEBOUNCE_MS 1100 49 49 50 - /* AVI header and aspect ratio */ 51 - #define HDMI_AVI_VERSION 0x02 52 - #define HDMI_AVI_LENGTH 0x0d 53 - 54 - /* AUI header info */ 55 - #define HDMI_AUI_VERSION 0x01 56 - #define HDMI_AUI_LENGTH 0x0a 57 - 58 - /* AVI active format aspect ratio */ 59 - #define AVI_SAME_AS_PIC_ASPECT_RATIO 0x08 60 - #define AVI_4_3_CENTER_RATIO 0x09 61 - #define AVI_16_9_CENTER_RATIO 0x0a 62 - 63 50 enum hdmi_type { 64 51 HDMI_TYPE13, 65 52 HDMI_TYPE14, ··· 118 131 bool dvi_mode; 119 132 struct delayed_work hotplug_work; 120 133 struct drm_display_mode current_mode; 121 - u8 cea_video_id; 122 134 const struct hdmi_driver_data *drv_data; 123 135 124 136 void __iomem *regs; ··· 667 681 } 668 682 } 669 683 684 + static inline void hdmi_reg_write_buf(struct hdmi_context *hdata, u32 reg_id, 685 + u8 *buf, int size) 686 + { 687 + for (reg_id = hdmi_map_reg(hdata, reg_id); size; --size, reg_id += 4) 688 + writel(*buf++, hdata->regs + reg_id); 689 + } 690 + 670 691 static inline void hdmi_reg_writemask(struct hdmi_context *hdata, 671 692 u32 reg_id, u32 value, u32 mask) 672 693 { ··· 755 762 return ret; 756 763 } 757 764 758 - static u8 hdmi_chksum(struct hdmi_context *hdata, 759 - u32 start, u8 len, u32 hdr_sum) 765 + static void hdmi_reg_infoframes(struct hdmi_context *hdata) 760 766 { 761 - int i; 762 - 763 - /* hdr_sum : header0 + header1 + header2 764 - * start : start address of packet byte1 765 - * len : packet bytes - 1 */ 766 - for (i = 0; i < len; ++i) 767 - hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4); 768 - 769 - /* return 2's complement of 8 bit hdr_sum */ 770 - return (u8)(~(hdr_sum & 0xff) + 1); 771 - } 772 - 773 - static void hdmi_reg_infoframe(struct hdmi_context *hdata, 774 - union hdmi_infoframe *infoframe) 775 - { 776 - u32 hdr_sum; 777 - u8 chksum; 778 - u8 ar; 767 + union hdmi_infoframe frm; 768 + u8 buf[25]; 769 + int ret; 779 770 780 771 if (hdata->dvi_mode) { 781 - hdmi_reg_writeb(hdata, HDMI_VSI_CON, 782 - HDMI_VSI_CON_DO_NOT_TRANSMIT); 783 772 hdmi_reg_writeb(hdata, HDMI_AVI_CON, 784 773 HDMI_AVI_CON_DO_NOT_TRANSMIT); 774 + hdmi_reg_writeb(hdata, HDMI_VSI_CON, 775 + HDMI_VSI_CON_DO_NOT_TRANSMIT); 785 776 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN); 786 777 return; 787 778 } 788 779 789 - switch (infoframe->any.type) { 790 - case HDMI_INFOFRAME_TYPE_AVI: 780 + ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, 781 + &hdata->current_mode); 782 + if (!ret) 783 + ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); 784 + if (ret > 0) { 791 785 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC); 792 - hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type); 793 - hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1, 794 - infoframe->any.version); 795 - hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length); 796 - hdr_sum = infoframe->any.type + infoframe->any.version + 797 - infoframe->any.length; 786 + hdmi_reg_write_buf(hdata, HDMI_AVI_HEADER0, buf, ret); 787 + } else { 788 + DRM_INFO("%s: invalid AVI infoframe (%d)\n", __func__, ret); 789 + } 798 790 799 - /* Output format zero hardcoded ,RGB YBCR selection */ 800 - hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 | 801 - AVI_ACTIVE_FORMAT_VALID | 802 - AVI_UNDERSCANNED_DISPLAY_VALID); 791 + ret = drm_hdmi_vendor_infoframe_from_display_mode(&frm.vendor.hdmi, 792 + &hdata->current_mode); 793 + if (!ret) 794 + ret = hdmi_vendor_infoframe_pack(&frm.vendor.hdmi, buf, 795 + sizeof(buf)); 796 + if (ret > 0) { 797 + hdmi_reg_writeb(hdata, HDMI_VSI_CON, HDMI_VSI_CON_EVERY_VSYNC); 798 + hdmi_reg_write_buf(hdata, HDMI_VSI_HEADER0, buf, ret); 799 + } 803 800 804 - /* 805 - * Set the aspect ratio as per the mode, mentioned in 806 - * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard 807 - */ 808 - ar = hdata->current_mode.picture_aspect_ratio; 809 - switch (ar) { 810 - case HDMI_PICTURE_ASPECT_4_3: 811 - ar |= AVI_4_3_CENTER_RATIO; 812 - break; 813 - case HDMI_PICTURE_ASPECT_16_9: 814 - ar |= AVI_16_9_CENTER_RATIO; 815 - break; 816 - case HDMI_PICTURE_ASPECT_NONE: 817 - default: 818 - ar |= AVI_SAME_AS_PIC_ASPECT_RATIO; 819 - break; 820 - } 821 - hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), ar); 822 - 823 - hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->cea_video_id); 824 - 825 - chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1), 826 - infoframe->any.length, hdr_sum); 827 - DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum); 828 - hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum); 829 - break; 830 - case HDMI_INFOFRAME_TYPE_AUDIO: 831 - hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02); 832 - hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type); 833 - hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1, 834 - infoframe->any.version); 835 - hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length); 836 - hdr_sum = infoframe->any.type + infoframe->any.version + 837 - infoframe->any.length; 838 - chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1), 839 - infoframe->any.length, hdr_sum); 840 - DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum); 841 - hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum); 842 - break; 843 - default: 844 - break; 801 + ret = hdmi_audio_infoframe_init(&frm.audio); 802 + if (!ret) { 803 + frm.audio.channels = 2; 804 + ret = hdmi_audio_infoframe_pack(&frm.audio, buf, sizeof(buf)); 805 + } 806 + if (ret > 0) { 807 + hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); 808 + hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, ret); 845 809 } 846 810 } 847 811 ··· 1077 1127 1078 1128 static void hdmi_conf_init(struct hdmi_context *hdata) 1079 1129 { 1080 - union hdmi_infoframe infoframe; 1081 - 1082 1130 /* disable HPD interrupts from HDMI IP block, use GPIO instead */ 1083 1131 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL | 1084 1132 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG); ··· 1112 1164 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02); 1113 1165 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04); 1114 1166 } else { 1115 - infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI; 1116 - infoframe.any.version = HDMI_AVI_VERSION; 1117 - infoframe.any.length = HDMI_AVI_LENGTH; 1118 - hdmi_reg_infoframe(hdata, &infoframe); 1119 - 1120 - infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO; 1121 - infoframe.any.version = HDMI_AUI_VERSION; 1122 - infoframe.any.length = HDMI_AUI_LENGTH; 1123 - hdmi_reg_infoframe(hdata, &infoframe); 1167 + hdmi_reg_infoframes(hdata); 1124 1168 1125 1169 /* enable AVI packet every vsync, fixes purple line problem */ 1126 1170 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5); ··· 1398 1458 "INTERLACED" : "PROGRESSIVE"); 1399 1459 1400 1460 drm_mode_copy(&hdata->current_mode, m); 1401 - hdata->cea_video_id = drm_match_cea_mode(mode); 1402 1461 } 1403 1462 1404 1463 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
+2
drivers/gpu/drm/exynos/regs-hdmi.h
··· 361 361 362 362 /* AUI bit definition */ 363 363 #define HDMI_AUI_CON_NO_TRAN (0 << 0) 364 + #define HDMI_AUI_CON_EVERY_VSYNC (1 << 1) 364 365 365 366 /* VSI bit definition */ 366 367 #define HDMI_VSI_CON_DO_NOT_TRANSMIT (0 << 0) 368 + #define HDMI_VSI_CON_EVERY_VSYNC (1 << 1) 367 369 368 370 /* HDCP related registers */ 369 371 #define HDMI_HDCP_SHA1(n) HDMI_CORE_BASE(0x7000 + 4 * (n))