Merge tag 'drm-fixes-2025-04-26' of https://gitlab.freedesktop.org/drm/kernel

Pull drm fixes from Dave Airlie:
"Weekly drm fixes, mostly amdgpu, with some exynos cleanups and a
couple of minor fixes, seems a bit quiet, but probably some lag from
Easter holidays.

amdgpu:
- P2P DMA fixes
- Display reset fixes
- DCN 3.5 fixes
- ACPI EDID fix
- LTTPR fix
- mode_valid() fix

exynos:
- fix spelling error
- remove redundant error handling in exynos_drm_vidi.c module
- marks struct decon_data as const in the exynos7_drm_decon driver
since it is only read
- Remove unnecessary checking in exynos_drm_drv.c module

meson:
- Fix VCLK calculation

panel:
- jd9365a: Fix reset polarity"

* tag 'drm-fixes-2025-04-26' of https://gitlab.freedesktop.org/drm/kernel:
drm/exynos: Fix spelling mistake "enqueu" -> "enqueue"
drm/exynos: exynos7_drm_decon: Consstify struct decon_data
drm/exynos: fixed a spelling error
drm/exynos/vidi: Remove redundant error handling in vidi_get_modes()
drm/exynos: Remove unnecessary checking
drm/amd/display: do not copy invalid CRTC timing info
drm/amd/display: Default IPS to RCG_IN_ACTIVE_IPS2_IN_OFF
drm/amd/display: Use 16ms AUX read interval for LTTPR with old sinks
drm/amd/display: Fix ACPI edid parsing on some Lenovo systems
drm/amdgpu: Allow P2P access through XGMI
drm/amd/display: Enable urgent latency adjustment on DCN35
drm/amd/display: Force full update in gpu reset
drm/amd/display: Fix gpu reset in multidisplay config
drm/amdgpu: Don't pin VRAM without DMABUF_MOVE_NOTIFY
drm/amdgpu: Use allowed_domains for pinning dmabufs
drm: panel: jd9365da: fix reset signal polarity in unprepare
drm/meson: use unsigned long long / Hz for frequency types
Revert "drm/meson: vclk: fix calculation of 59.94 fractional rates"

+229 -183
+45 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
··· 43 #include <linux/dma-fence-array.h> 44 #include <linux/pci-p2pdma.h> 45 46 /** 47 * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation 48 * ··· 77 static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, 78 struct dma_buf_attachment *attach) 79 { 80 struct drm_gem_object *obj = dmabuf->priv; 81 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 82 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 83 84 - if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) 85 attach->peer2peer = false; 86 87 amdgpu_vm_bo_update_shared(bo); ··· 102 { 103 struct dma_buf *dmabuf = attach->dmabuf; 104 struct amdgpu_bo *bo = gem_to_amdgpu_bo(dmabuf->priv); 105 - u32 domains = bo->preferred_domains; 106 107 dma_resv_assert_held(dmabuf->resv); 108 109 - /* 110 - * Try pinning into VRAM to allow P2P with RDMA NICs without ODP 111 * support if all attachments can do P2P. If any attachment can't do 112 * P2P just pin into GTT instead. 113 */ 114 - list_for_each_entry(attach, &dmabuf->attachments, node) 115 - if (!attach->peer2peer) 116 - domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 117 118 if (domains & AMDGPU_GEM_DOMAIN_VRAM) 119 bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; 120 121 return amdgpu_bo_pin(bo, domains); 122 } ··· 504 { 505 struct drm_gem_object *obj = &bo->tbo.base; 506 struct drm_gem_object *gobj; 507 508 if (obj->import_attach) { 509 struct dma_buf *dma_buf = obj->import_attach->dmabuf;
··· 43 #include <linux/dma-fence-array.h> 44 #include <linux/pci-p2pdma.h> 45 46 + static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops; 47 + 48 + /** 49 + * dma_buf_attach_adev - Helper to get adev of an attachment 50 + * 51 + * @attach: attachment 52 + * 53 + * Returns: 54 + * A struct amdgpu_device * if the attaching device is an amdgpu device or 55 + * partition, NULL otherwise. 56 + */ 57 + static struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment *attach) 58 + { 59 + if (attach->importer_ops == &amdgpu_dma_buf_attach_ops) { 60 + struct drm_gem_object *obj = attach->importer_priv; 61 + struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 62 + 63 + return amdgpu_ttm_adev(bo->tbo.bdev); 64 + } 65 + 66 + return NULL; 67 + } 68 + 69 /** 70 * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation 71 * ··· 54 static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, 55 struct dma_buf_attachment *attach) 56 { 57 + struct amdgpu_device *attach_adev = dma_buf_attach_adev(attach); 58 struct drm_gem_object *obj = dmabuf->priv; 59 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 60 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 61 62 + if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) && 63 + pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) 64 attach->peer2peer = false; 65 66 amdgpu_vm_bo_update_shared(bo); ··· 77 { 78 struct dma_buf *dmabuf = attach->dmabuf; 79 struct amdgpu_bo *bo = gem_to_amdgpu_bo(dmabuf->priv); 80 + u32 domains = bo->allowed_domains; 81 82 dma_resv_assert_held(dmabuf->resv); 83 84 + /* Try pinning into VRAM to allow P2P with RDMA NICs without ODP 85 * support if all attachments can do P2P. If any attachment can't do 86 * P2P just pin into GTT instead. 87 + * 88 + * To avoid with conflicting pinnings between GPUs and RDMA when move 89 + * notifiers are disabled, only allow pinning in VRAM when move 90 + * notiers are enabled. 91 */ 92 + if (!IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) { 93 + domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 94 + } else { 95 + list_for_each_entry(attach, &dmabuf->attachments, node) 96 + if (!attach->peer2peer) 97 + domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 98 + } 99 100 if (domains & AMDGPU_GEM_DOMAIN_VRAM) 101 bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; 102 + 103 + if (WARN_ON(!domains)) 104 + return -EINVAL; 105 106 return amdgpu_bo_pin(bo, domains); 107 } ··· 469 { 470 struct drm_gem_object *obj = &bo->tbo.base; 471 struct drm_gem_object *gobj; 472 + 473 + if (!adev) 474 + return false; 475 476 if (obj->import_attach) { 477 struct dma_buf *dma_buf = obj->import_attach->dmabuf;
+12 -29
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 1920 switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) { 1921 case IP_VERSION(3, 5, 0): 1922 case IP_VERSION(3, 6, 0): 1923 - /* 1924 - * On DCN35 systems with Z8 enabled, it's possible for IPS2 + Z8 to 1925 - * cause a hard hang. A fix exists for newer PMFW. 1926 - * 1927 - * As a workaround, for non-fixed PMFW, force IPS1+RCG as the deepest 1928 - * IPS state in all cases, except for s0ix and all displays off (DPMS), 1929 - * where IPS2 is allowed. 1930 - * 1931 - * When checking pmfw version, use the major and minor only. 1932 - */ 1933 - if ((adev->pm.fw_version & 0x00FFFF00) < 0x005D6300) 1934 - ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1935 - else if (amdgpu_ip_version(adev, GC_HWIP, 0) > IP_VERSION(11, 5, 0)) 1936 - /* 1937 - * Other ASICs with DCN35 that have residency issues with 1938 - * IPS2 in idle. 1939 - * We want them to use IPS2 only in display off cases. 1940 - */ 1941 - ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1942 - break; 1943 case IP_VERSION(3, 5, 1): 1944 ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1945 break; ··· 3335 for (k = 0; k < dc_state->stream_count; k++) { 3336 bundle->stream_update.stream = dc_state->streams[k]; 3337 3338 - for (m = 0; m < dc_state->stream_status->plane_count; m++) { 3339 bundle->surface_updates[m].surface = 3340 - dc_state->stream_status->plane_states[m]; 3341 bundle->surface_updates[m].surface->force_full_update = 3342 true; 3343 } 3344 3345 update_planes_and_stream_adapter(dm->dc, 3346 UPDATE_TYPE_FULL, 3347 - dc_state->stream_status->plane_count, 3348 dc_state->streams[k], 3349 &bundle->stream_update, 3350 bundle->surface_updates); ··· 6501 const struct drm_display_mode *native_mode, 6502 bool scale_enabled) 6503 { 6504 - if (scale_enabled) { 6505 - copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6506 - } else if (native_mode->clock == drm_mode->clock && 6507 - native_mode->htotal == drm_mode->htotal && 6508 - native_mode->vtotal == drm_mode->vtotal) { 6509 - copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6510 } else { 6511 /* no scaling nor amdgpu inserted, no need to patch */ 6512 } ··· 11021 */ 11022 if (amdgpu_ip_version(adev, DCE_HWIP, 0) < IP_VERSION(3, 2, 0) && 11023 state->allow_modeset) 11024 return true; 11025 11026 /* Exit early if we know that we're adding or removing the plane. */
··· 1920 switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) { 1921 case IP_VERSION(3, 5, 0): 1922 case IP_VERSION(3, 6, 0): 1923 case IP_VERSION(3, 5, 1): 1924 ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1925 break; ··· 3355 for (k = 0; k < dc_state->stream_count; k++) { 3356 bundle->stream_update.stream = dc_state->streams[k]; 3357 3358 + for (m = 0; m < dc_state->stream_status[k].plane_count; m++) { 3359 bundle->surface_updates[m].surface = 3360 + dc_state->stream_status[k].plane_states[m]; 3361 bundle->surface_updates[m].surface->force_full_update = 3362 true; 3363 } 3364 3365 update_planes_and_stream_adapter(dm->dc, 3366 UPDATE_TYPE_FULL, 3367 + dc_state->stream_status[k].plane_count, 3368 dc_state->streams[k], 3369 &bundle->stream_update, 3370 bundle->surface_updates); ··· 6521 const struct drm_display_mode *native_mode, 6522 bool scale_enabled) 6523 { 6524 + if (scale_enabled || ( 6525 + native_mode->clock == drm_mode->clock && 6526 + native_mode->htotal == drm_mode->htotal && 6527 + native_mode->vtotal == drm_mode->vtotal)) { 6528 + if (native_mode->crtc_clock) 6529 + copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6530 } else { 6531 /* no scaling nor amdgpu inserted, no need to patch */ 6532 } ··· 11041 */ 11042 if (amdgpu_ip_version(adev, DCE_HWIP, 0) < IP_VERSION(3, 2, 0) && 11043 state->allow_modeset) 11044 + return true; 11045 + 11046 + if (amdgpu_in_reset(adev) && state->allow_modeset) 11047 return true; 11048 11049 /* Exit early if we know that we're adding or removing the plane. */
+1 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
··· 918 { 919 struct drm_connector *connector = data; 920 struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev); 921 - unsigned char start = block * EDID_LENGTH; 922 struct edid *edid; 923 int r; 924
··· 918 { 919 struct drm_connector *connector = data; 920 struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev); 921 + unsigned short start = block * EDID_LENGTH; 922 struct edid *edid; 923 int r; 924
+2 -2
drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c
··· 195 .dcn_downspread_percent = 0.5, 196 .gpuvm_min_page_size_bytes = 4096, 197 .hostvm_min_page_size_bytes = 4096, 198 - .do_urgent_latency_adjustment = 0, 199 .urgent_latency_adjustment_fabric_clock_component_us = 0, 200 - .urgent_latency_adjustment_fabric_clock_reference_mhz = 0, 201 }; 202 203 void dcn35_build_wm_range_table_fpu(struct clk_mgr *clk_mgr)
··· 195 .dcn_downspread_percent = 0.5, 196 .gpuvm_min_page_size_bytes = 4096, 197 .hostvm_min_page_size_bytes = 4096, 198 + .do_urgent_latency_adjustment = 1, 199 .urgent_latency_adjustment_fabric_clock_component_us = 0, 200 + .urgent_latency_adjustment_fabric_clock_reference_mhz = 3000, 201 }; 202 203 void dcn35_build_wm_range_table_fpu(struct clk_mgr *clk_mgr)
+2 -2
drivers/gpu/drm/exynos/exynos7_drm_decon.c
··· 43 unsigned int wincon_burstlen_shift; 44 }; 45 46 - static struct decon_data exynos7_decon_data = { 47 .vidw_buf_start_base = 0x80, 48 .shadowcon_win_protect_shift = 10, 49 .wincon_burstlen_shift = 11, 50 }; 51 52 - static struct decon_data exynos7870_decon_data = { 53 .vidw_buf_start_base = 0x880, 54 .shadowcon_win_protect_shift = 8, 55 .wincon_burstlen_shift = 10,
··· 43 unsigned int wincon_burstlen_shift; 44 }; 45 46 + static const struct decon_data exynos7_decon_data = { 47 .vidw_buf_start_base = 0x80, 48 .shadowcon_win_protect_shift = 10, 49 .wincon_burstlen_shift = 11, 50 }; 51 52 + static const struct decon_data exynos7870_decon_data = { 53 .vidw_buf_start_base = 0x880, 54 .shadowcon_win_protect_shift = 8, 55 .wincon_burstlen_shift = 10,
+1 -2
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 355 { 356 struct drm_device *drm = platform_get_drvdata(pdev); 357 358 - if (drm) 359 - drm_atomic_helper_shutdown(drm); 360 } 361 362 static struct platform_driver exynos_drm_platform_driver = {
··· 355 { 356 struct drm_device *drm = platform_get_drvdata(pdev); 357 358 + drm_atomic_helper_shutdown(drm); 359 } 360 361 static struct platform_driver exynos_drm_platform_driver = {
+1 -1
drivers/gpu/drm/exynos/exynos_drm_fimc.c
··· 908 u32 buf_num; 909 u32 cfg; 910 911 - DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]enqueu[%d]\n", buf_id, enqueue); 912 913 spin_lock_irqsave(&ctx->lock, flags); 914
··· 908 u32 buf_num; 909 u32 cfg; 910 911 + DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]enqueue[%d]\n", buf_id, enqueue); 912 913 spin_lock_irqsave(&ctx->lock, flags); 914
+1 -1
drivers/gpu/drm/exynos/exynos_drm_fimd.c
··· 731 /* 732 * Setting dma-burst to 16Word causes permanent tearing for very small 733 * buffers, e.g. cursor buffer. Burst Mode switching which based on 734 - * plane size is not recommended as plane size varies alot towards the 735 * end of the screen and rapid movement causes unstable DMA, but it is 736 * still better to change dma-burst than displaying garbage. 737 */
··· 731 /* 732 * Setting dma-burst to 16Word causes permanent tearing for very small 733 * buffers, e.g. cursor buffer. Burst Mode switching which based on 734 + * plane size is not recommended as plane size varies a lot towards the 735 * end of the screen and rapid movement causes unstable DMA, but it is 736 * still better to change dma-burst than displaying garbage. 737 */
-3
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 312 else 313 drm_edid = drm_edid_alloc(fake_edid_info, sizeof(fake_edid_info)); 314 315 - if (!drm_edid) 316 - return 0; 317 - 318 drm_edid_connector_update(connector, drm_edid); 319 320 count = drm_edid_connector_add_modes(connector);
··· 312 else 313 drm_edid = drm_edid_alloc(fake_edid_info, sizeof(fake_edid_info)); 314 315 drm_edid_connector_update(connector, drm_edid); 316 317 count = drm_edid_connector_add_modes(connector);
+1 -1
drivers/gpu/drm/meson/meson_drv.c
··· 169 /* S805X/S805Y HDMI PLL won't lock for HDMI PHY freq > 1,65GHz */ 170 { 171 .limits = { 172 - .max_hdmi_phy_freq = 1650000, 173 }, 174 .attrs = (const struct soc_device_attribute []) { 175 { .soc_id = "GXL (S805*)", },
··· 169 /* S805X/S805Y HDMI PLL won't lock for HDMI PHY freq > 1,65GHz */ 170 { 171 .limits = { 172 + .max_hdmi_phy_freq = 1650000000, 173 }, 174 .attrs = (const struct soc_device_attribute []) { 175 { .soc_id = "GXL (S805*)", },
+1 -1
drivers/gpu/drm/meson/meson_drv.h
··· 37 }; 38 39 struct meson_drm_soc_limits { 40 - unsigned int max_hdmi_phy_freq; 41 }; 42 43 struct meson_drm {
··· 37 }; 38 39 struct meson_drm_soc_limits { 40 + unsigned long long max_hdmi_phy_freq; 41 }; 42 43 struct meson_drm {
+16 -13
drivers/gpu/drm/meson/meson_encoder_hdmi.c
··· 70 { 71 struct meson_drm *priv = encoder_hdmi->priv; 72 int vic = drm_match_cea_mode(mode); 73 - unsigned int phy_freq; 74 - unsigned int vclk_freq; 75 - unsigned int venc_freq; 76 - unsigned int hdmi_freq; 77 78 - vclk_freq = mode->clock; 79 80 /* For 420, pixel clock is half unlike venc clock */ 81 if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) ··· 107 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 108 venc_freq /= 2; 109 110 - dev_dbg(priv->dev, "vclk:%d phy=%d venc=%d hdmi=%d enci=%d\n", 111 phy_freq, vclk_freq, venc_freq, hdmi_freq, 112 priv->venc.hdmi_use_enci); 113 ··· 123 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); 124 struct meson_drm *priv = encoder_hdmi->priv; 125 bool is_hdmi2_sink = display_info->hdmi.scdc.supported; 126 - unsigned int phy_freq; 127 - unsigned int vclk_freq; 128 - unsigned int venc_freq; 129 - unsigned int hdmi_freq; 130 int vic = drm_match_cea_mode(mode); 131 enum drm_mode_status status; 132 ··· 146 if (status != MODE_OK) 147 return status; 148 149 - return meson_vclk_dmt_supported_freq(priv, mode->clock); 150 /* Check against supported VIC modes */ 151 } else if (!meson_venc_hdmi_supported_vic(vic)) 152 return MODE_BAD; 153 154 - vclk_freq = mode->clock; 155 156 /* For 420, pixel clock is half unlike venc clock */ 157 if (drm_mode_is_420_only(display_info, mode) || ··· 181 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 182 venc_freq /= 2; 183 184 - dev_dbg(priv->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n", 185 __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); 186 187 return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq);
··· 70 { 71 struct meson_drm *priv = encoder_hdmi->priv; 72 int vic = drm_match_cea_mode(mode); 73 + unsigned long long phy_freq; 74 + unsigned long long vclk_freq; 75 + unsigned long long venc_freq; 76 + unsigned long long hdmi_freq; 77 78 + vclk_freq = mode->clock * 1000; 79 80 /* For 420, pixel clock is half unlike venc clock */ 81 if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) ··· 107 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 108 venc_freq /= 2; 109 110 + dev_dbg(priv->dev, 111 + "vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", 112 phy_freq, vclk_freq, venc_freq, hdmi_freq, 113 priv->venc.hdmi_use_enci); 114 ··· 122 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); 123 struct meson_drm *priv = encoder_hdmi->priv; 124 bool is_hdmi2_sink = display_info->hdmi.scdc.supported; 125 + unsigned long long clock = mode->clock * 1000; 126 + unsigned long long phy_freq; 127 + unsigned long long vclk_freq; 128 + unsigned long long venc_freq; 129 + unsigned long long hdmi_freq; 130 int vic = drm_match_cea_mode(mode); 131 enum drm_mode_status status; 132 ··· 144 if (status != MODE_OK) 145 return status; 146 147 + return meson_vclk_dmt_supported_freq(priv, clock); 148 /* Check against supported VIC modes */ 149 } else if (!meson_venc_hdmi_supported_vic(vic)) 150 return MODE_BAD; 151 152 + vclk_freq = clock; 153 154 /* For 420, pixel clock is half unlike venc clock */ 155 if (drm_mode_is_420_only(display_info, mode) || ··· 179 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 180 venc_freq /= 2; 181 182 + dev_dbg(priv->dev, 183 + "%s: vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz\n", 184 __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); 185 186 return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq);
+101 -94
drivers/gpu/drm/meson/meson_vclk.c
··· 110 #define HDMI_PLL_LOCK BIT(31) 111 #define HDMI_PLL_LOCK_G12A (3 << 30) 112 113 - #define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST(_freq * 1000, 1001) 114 115 /* VID PLL Dividers */ 116 enum { ··· 363 }; 364 365 struct meson_vclk_params { 366 - unsigned int pll_freq; 367 - unsigned int phy_freq; 368 - unsigned int vclk_freq; 369 - unsigned int venc_freq; 370 - unsigned int pixel_freq; 371 unsigned int pll_od1; 372 unsigned int pll_od2; 373 unsigned int pll_od3; ··· 375 unsigned int vclk_div; 376 } params[] = { 377 [MESON_VCLK_HDMI_ENCI_54000] = { 378 - .pll_freq = 4320000, 379 - .phy_freq = 270000, 380 - .vclk_freq = 54000, 381 - .venc_freq = 54000, 382 - .pixel_freq = 54000, 383 .pll_od1 = 4, 384 .pll_od2 = 4, 385 .pll_od3 = 1, ··· 387 .vclk_div = 1, 388 }, 389 [MESON_VCLK_HDMI_DDR_54000] = { 390 - .pll_freq = 4320000, 391 - .phy_freq = 270000, 392 - .vclk_freq = 54000, 393 - .venc_freq = 54000, 394 - .pixel_freq = 27000, 395 .pll_od1 = 4, 396 .pll_od2 = 4, 397 .pll_od3 = 1, ··· 399 .vclk_div = 1, 400 }, 401 [MESON_VCLK_HDMI_DDR_148500] = { 402 - .pll_freq = 2970000, 403 - .phy_freq = 742500, 404 - .vclk_freq = 148500, 405 - .venc_freq = 148500, 406 - .pixel_freq = 74250, 407 .pll_od1 = 4, 408 .pll_od2 = 1, 409 .pll_od3 = 1, ··· 411 .vclk_div = 1, 412 }, 413 [MESON_VCLK_HDMI_74250] = { 414 - .pll_freq = 2970000, 415 - .phy_freq = 742500, 416 - .vclk_freq = 74250, 417 - .venc_freq = 74250, 418 - .pixel_freq = 74250, 419 .pll_od1 = 2, 420 .pll_od2 = 2, 421 .pll_od3 = 2, ··· 423 .vclk_div = 1, 424 }, 425 [MESON_VCLK_HDMI_148500] = { 426 - .pll_freq = 2970000, 427 - .phy_freq = 1485000, 428 - .vclk_freq = 148500, 429 - .venc_freq = 148500, 430 - .pixel_freq = 148500, 431 .pll_od1 = 1, 432 .pll_od2 = 2, 433 .pll_od3 = 2, ··· 435 .vclk_div = 1, 436 }, 437 [MESON_VCLK_HDMI_297000] = { 438 - .pll_freq = 5940000, 439 - .phy_freq = 2970000, 440 - .venc_freq = 297000, 441 - .vclk_freq = 297000, 442 - .pixel_freq = 297000, 443 .pll_od1 = 2, 444 .pll_od2 = 1, 445 .pll_od3 = 1, ··· 447 .vclk_div = 2, 448 }, 449 [MESON_VCLK_HDMI_594000] = { 450 - .pll_freq = 5940000, 451 - .phy_freq = 5940000, 452 - .venc_freq = 594000, 453 - .vclk_freq = 594000, 454 - .pixel_freq = 594000, 455 .pll_od1 = 1, 456 .pll_od2 = 1, 457 .pll_od3 = 2, ··· 459 .vclk_div = 1, 460 }, 461 [MESON_VCLK_HDMI_594000_YUV420] = { 462 - .pll_freq = 5940000, 463 - .phy_freq = 2970000, 464 - .venc_freq = 594000, 465 - .vclk_freq = 594000, 466 - .pixel_freq = 297000, 467 .pll_od1 = 2, 468 .pll_od2 = 1, 469 .pll_od3 = 1, ··· 620 3 << 20, pll_od_to_reg(od3) << 20); 621 } 622 623 - #define XTAL_FREQ 24000 624 625 static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, 626 - unsigned int pll_freq) 627 { 628 /* The GXBB PLL has a /2 pre-multiplier */ 629 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) 630 - pll_freq /= 2; 631 632 - return pll_freq / XTAL_FREQ; 633 } 634 635 #define HDMI_FRAC_MAX_GXBB 4096 ··· 638 639 static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, 640 unsigned int m, 641 - unsigned int pll_freq) 642 { 643 - unsigned int parent_freq = XTAL_FREQ; 644 unsigned int frac_max = HDMI_FRAC_MAX_GXL; 645 unsigned int frac_m; 646 unsigned int frac; 647 648 /* The GXBB PLL has a /2 pre-multiplier and a larger FRAC width */ 649 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 656 frac_max = HDMI_FRAC_MAX_G12A; 657 658 /* We can have a perfect match !*/ 659 - if (pll_freq / m == parent_freq && 660 - pll_freq % m == 0) 661 return 0; 662 663 - frac = div_u64((u64)pll_freq * (u64)frac_max, parent_freq); 664 frac_m = m * frac_max; 665 if (frac_m > frac) 666 return frac_max; ··· 670 } 671 672 static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, 673 - unsigned int m, 674 unsigned int frac) 675 { 676 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 698 } 699 700 static bool meson_hdmi_pll_find_params(struct meson_drm *priv, 701 - unsigned int freq, 702 unsigned int *m, 703 unsigned int *frac, 704 unsigned int *od) ··· 710 continue; 711 *frac = meson_hdmi_pll_get_frac(priv, *m, freq * *od); 712 713 - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d\n", 714 freq, *m, *frac, *od); 715 716 if (meson_hdmi_pll_validate_params(priv, *m, *frac)) ··· 722 723 /* pll_freq is the frequency after the OD dividers */ 724 enum drm_mode_status 725 - meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq) 726 { 727 unsigned int od, m, frac; 728 ··· 745 746 /* pll_freq is the frequency after the OD dividers */ 747 static void meson_hdmi_pll_generic_set(struct meson_drm *priv, 748 - unsigned int pll_freq) 749 { 750 unsigned int od, m, frac, od1, od2, od3; 751 ··· 760 od1 = od / od2; 761 } 762 763 - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d/%d/%d\n", 764 pll_freq, m, frac, od1, od2, od3); 765 766 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); ··· 768 return; 769 } 770 771 - DRM_ERROR("Fatal, unable to find parameters for PLL freq %d\n", 772 pll_freq); 773 } 774 775 enum drm_mode_status 776 - meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, 777 - unsigned int vclk_freq) 778 { 779 int i; 780 781 - DRM_DEBUG_DRIVER("phy_freq = %d vclk_freq = %d\n", 782 phy_freq, vclk_freq); 783 784 /* Check against soc revision/package limits */ ··· 790 } 791 792 for (i = 0 ; params[i].pixel_freq ; ++i) { 793 - DRM_DEBUG_DRIVER("i = %d pixel_freq = %d alt = %d\n", 794 i, params[i].pixel_freq, 795 - FREQ_1000_1001(params[i].pixel_freq)); 796 - DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n", 797 i, params[i].phy_freq, 798 - FREQ_1000_1001(params[i].phy_freq/1000)*1000); 799 /* Match strict frequency */ 800 if (phy_freq == params[i].phy_freq && 801 vclk_freq == params[i].vclk_freq) 802 return MODE_OK; 803 /* Match 1000/1001 variant */ 804 - if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/1000)*1000) && 805 - vclk_freq == FREQ_1000_1001(params[i].vclk_freq)) 806 return MODE_OK; 807 } 808 ··· 810 } 811 EXPORT_SYMBOL_GPL(meson_vclk_vic_supported_freq); 812 813 - static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, 814 - unsigned int od1, unsigned int od2, unsigned int od3, 815 unsigned int vid_pll_div, unsigned int vclk_div, 816 unsigned int hdmi_tx_div, unsigned int venc_div, 817 bool hdmi_use_enci, bool vic_alternate_clock) ··· 832 meson_hdmi_pll_generic_set(priv, pll_base_freq); 833 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { 834 switch (pll_base_freq) { 835 - case 2970000: 836 m = 0x3d; 837 frac = vic_alternate_clock ? 0xd02 : 0xe00; 838 break; 839 - case 4320000: 840 m = vic_alternate_clock ? 0x59 : 0x5a; 841 frac = vic_alternate_clock ? 0xe8f : 0; 842 break; 843 - case 5940000: 844 m = 0x7b; 845 frac = vic_alternate_clock ? 0xa05 : 0xc00; 846 break; ··· 850 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || 851 meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { 852 switch (pll_base_freq) { 853 - case 2970000: 854 m = 0x7b; 855 frac = vic_alternate_clock ? 0x281 : 0x300; 856 break; 857 - case 4320000: 858 m = vic_alternate_clock ? 0xb3 : 0xb4; 859 frac = vic_alternate_clock ? 0x347 : 0; 860 break; 861 - case 5940000: 862 m = 0xf7; 863 frac = vic_alternate_clock ? 0x102 : 0x200; 864 break; ··· 867 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); 868 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { 869 switch (pll_base_freq) { 870 - case 2970000: 871 m = 0x7b; 872 frac = vic_alternate_clock ? 0x140b4 : 0x18000; 873 break; 874 - case 4320000: 875 m = vic_alternate_clock ? 0xb3 : 0xb4; 876 frac = vic_alternate_clock ? 0x1a3ee : 0; 877 break; 878 - case 5940000: 879 m = 0xf7; 880 frac = vic_alternate_clock ? 0x8148 : 0x10000; 881 break; ··· 1031 } 1032 1033 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 1034 - unsigned int phy_freq, unsigned int vclk_freq, 1035 - unsigned int venc_freq, unsigned int dac_freq, 1036 bool hdmi_use_enci) 1037 { 1038 bool vic_alternate_clock = false; 1039 - unsigned int freq; 1040 - unsigned int hdmi_tx_div; 1041 - unsigned int venc_div; 1042 1043 if (target == MESON_VCLK_TARGET_CVBS) { 1044 meson_venci_cvbs_clock_config(priv); ··· 1058 return; 1059 } 1060 1061 - hdmi_tx_div = vclk_freq / dac_freq; 1062 1063 if (hdmi_tx_div == 0) { 1064 - pr_err("Fatal Error, invalid HDMI-TX freq %d\n", 1065 dac_freq); 1066 return; 1067 } 1068 1069 - venc_div = vclk_freq / venc_freq; 1070 1071 if (venc_div == 0) { 1072 - pr_err("Fatal Error, invalid HDMI venc freq %d\n", 1073 venc_freq); 1074 return; 1075 } 1076 1077 for (freq = 0 ; params[freq].pixel_freq ; ++freq) { 1078 if ((phy_freq == params[freq].phy_freq || 1079 - phy_freq == FREQ_1000_1001(params[freq].phy_freq/1000)*1000) && 1080 (vclk_freq == params[freq].vclk_freq || 1081 - vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) { 1082 if (vclk_freq != params[freq].vclk_freq) 1083 vic_alternate_clock = true; 1084 else ··· 1104 } 1105 1106 if (!params[freq].pixel_freq) { 1107 - pr_err("Fatal Error, invalid HDMI vclk freq %d\n", vclk_freq); 1108 return; 1109 } 1110
··· 110 #define HDMI_PLL_LOCK BIT(31) 111 #define HDMI_PLL_LOCK_G12A (3 << 30) 112 113 + #define PIXEL_FREQ_1000_1001(_freq) \ 114 + DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) 115 + #define PHY_FREQ_1000_1001(_freq) \ 116 + (PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10) 117 118 /* VID PLL Dividers */ 119 enum { ··· 360 }; 361 362 struct meson_vclk_params { 363 + unsigned long long pll_freq; 364 + unsigned long long phy_freq; 365 + unsigned long long vclk_freq; 366 + unsigned long long venc_freq; 367 + unsigned long long pixel_freq; 368 unsigned int pll_od1; 369 unsigned int pll_od2; 370 unsigned int pll_od3; ··· 372 unsigned int vclk_div; 373 } params[] = { 374 [MESON_VCLK_HDMI_ENCI_54000] = { 375 + .pll_freq = 4320000000, 376 + .phy_freq = 270000000, 377 + .vclk_freq = 54000000, 378 + .venc_freq = 54000000, 379 + .pixel_freq = 54000000, 380 .pll_od1 = 4, 381 .pll_od2 = 4, 382 .pll_od3 = 1, ··· 384 .vclk_div = 1, 385 }, 386 [MESON_VCLK_HDMI_DDR_54000] = { 387 + .pll_freq = 4320000000, 388 + .phy_freq = 270000000, 389 + .vclk_freq = 54000000, 390 + .venc_freq = 54000000, 391 + .pixel_freq = 27000000, 392 .pll_od1 = 4, 393 .pll_od2 = 4, 394 .pll_od3 = 1, ··· 396 .vclk_div = 1, 397 }, 398 [MESON_VCLK_HDMI_DDR_148500] = { 399 + .pll_freq = 2970000000, 400 + .phy_freq = 742500000, 401 + .vclk_freq = 148500000, 402 + .venc_freq = 148500000, 403 + .pixel_freq = 74250000, 404 .pll_od1 = 4, 405 .pll_od2 = 1, 406 .pll_od3 = 1, ··· 408 .vclk_div = 1, 409 }, 410 [MESON_VCLK_HDMI_74250] = { 411 + .pll_freq = 2970000000, 412 + .phy_freq = 742500000, 413 + .vclk_freq = 74250000, 414 + .venc_freq = 74250000, 415 + .pixel_freq = 74250000, 416 .pll_od1 = 2, 417 .pll_od2 = 2, 418 .pll_od3 = 2, ··· 420 .vclk_div = 1, 421 }, 422 [MESON_VCLK_HDMI_148500] = { 423 + .pll_freq = 2970000000, 424 + .phy_freq = 1485000000, 425 + .vclk_freq = 148500000, 426 + .venc_freq = 148500000, 427 + .pixel_freq = 148500000, 428 .pll_od1 = 1, 429 .pll_od2 = 2, 430 .pll_od3 = 2, ··· 432 .vclk_div = 1, 433 }, 434 [MESON_VCLK_HDMI_297000] = { 435 + .pll_freq = 5940000000, 436 + .phy_freq = 2970000000, 437 + .venc_freq = 297000000, 438 + .vclk_freq = 297000000, 439 + .pixel_freq = 297000000, 440 .pll_od1 = 2, 441 .pll_od2 = 1, 442 .pll_od3 = 1, ··· 444 .vclk_div = 2, 445 }, 446 [MESON_VCLK_HDMI_594000] = { 447 + .pll_freq = 5940000000, 448 + .phy_freq = 5940000000, 449 + .venc_freq = 594000000, 450 + .vclk_freq = 594000000, 451 + .pixel_freq = 594000000, 452 .pll_od1 = 1, 453 .pll_od2 = 1, 454 .pll_od3 = 2, ··· 456 .vclk_div = 1, 457 }, 458 [MESON_VCLK_HDMI_594000_YUV420] = { 459 + .pll_freq = 5940000000, 460 + .phy_freq = 2970000000, 461 + .venc_freq = 594000000, 462 + .vclk_freq = 594000000, 463 + .pixel_freq = 297000000, 464 .pll_od1 = 2, 465 .pll_od2 = 1, 466 .pll_od3 = 1, ··· 617 3 << 20, pll_od_to_reg(od3) << 20); 618 } 619 620 + #define XTAL_FREQ (24 * 1000 * 1000) 621 622 static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, 623 + unsigned long long pll_freq) 624 { 625 /* The GXBB PLL has a /2 pre-multiplier */ 626 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) 627 + pll_freq = DIV_ROUND_DOWN_ULL(pll_freq, 2); 628 629 + return DIV_ROUND_DOWN_ULL(pll_freq, XTAL_FREQ); 630 } 631 632 #define HDMI_FRAC_MAX_GXBB 4096 ··· 635 636 static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, 637 unsigned int m, 638 + unsigned long long pll_freq) 639 { 640 + unsigned long long parent_freq = XTAL_FREQ; 641 unsigned int frac_max = HDMI_FRAC_MAX_GXL; 642 unsigned int frac_m; 643 unsigned int frac; 644 + u32 remainder; 645 646 /* The GXBB PLL has a /2 pre-multiplier and a larger FRAC width */ 647 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 652 frac_max = HDMI_FRAC_MAX_G12A; 653 654 /* We can have a perfect match !*/ 655 + if (div_u64_rem(pll_freq, m, &remainder) == parent_freq && 656 + remainder == 0) 657 return 0; 658 659 + frac = mul_u64_u64_div_u64(pll_freq, frac_max, parent_freq); 660 frac_m = m * frac_max; 661 if (frac_m > frac) 662 return frac_max; ··· 666 } 667 668 static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, 669 + unsigned long long m, 670 unsigned int frac) 671 { 672 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 694 } 695 696 static bool meson_hdmi_pll_find_params(struct meson_drm *priv, 697 + unsigned long long freq, 698 unsigned int *m, 699 unsigned int *frac, 700 unsigned int *od) ··· 706 continue; 707 *frac = meson_hdmi_pll_get_frac(priv, *m, freq * *od); 708 709 + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d\n", 710 freq, *m, *frac, *od); 711 712 if (meson_hdmi_pll_validate_params(priv, *m, *frac)) ··· 718 719 /* pll_freq is the frequency after the OD dividers */ 720 enum drm_mode_status 721 + meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq) 722 { 723 unsigned int od, m, frac; 724 ··· 741 742 /* pll_freq is the frequency after the OD dividers */ 743 static void meson_hdmi_pll_generic_set(struct meson_drm *priv, 744 + unsigned long long pll_freq) 745 { 746 unsigned int od, m, frac, od1, od2, od3; 747 ··· 756 od1 = od / od2; 757 } 758 759 + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d/%d/%d\n", 760 pll_freq, m, frac, od1, od2, od3); 761 762 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); ··· 764 return; 765 } 766 767 + DRM_ERROR("Fatal, unable to find parameters for PLL freq %lluHz\n", 768 pll_freq); 769 } 770 771 enum drm_mode_status 772 + meson_vclk_vic_supported_freq(struct meson_drm *priv, 773 + unsigned long long phy_freq, 774 + unsigned long long vclk_freq) 775 { 776 int i; 777 778 + DRM_DEBUG_DRIVER("phy_freq = %lluHz vclk_freq = %lluHz\n", 779 phy_freq, vclk_freq); 780 781 /* Check against soc revision/package limits */ ··· 785 } 786 787 for (i = 0 ; params[i].pixel_freq ; ++i) { 788 + DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n", 789 i, params[i].pixel_freq, 790 + PIXEL_FREQ_1000_1001(params[i].pixel_freq)); 791 + DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", 792 i, params[i].phy_freq, 793 + PHY_FREQ_1000_1001(params[i].phy_freq)); 794 /* Match strict frequency */ 795 if (phy_freq == params[i].phy_freq && 796 vclk_freq == params[i].vclk_freq) 797 return MODE_OK; 798 /* Match 1000/1001 variant */ 799 + if (phy_freq == PHY_FREQ_1000_1001(params[i].phy_freq) && 800 + vclk_freq == PIXEL_FREQ_1000_1001(params[i].vclk_freq)) 801 return MODE_OK; 802 } 803 ··· 805 } 806 EXPORT_SYMBOL_GPL(meson_vclk_vic_supported_freq); 807 808 + static void meson_vclk_set(struct meson_drm *priv, 809 + unsigned long long pll_base_freq, unsigned int od1, 810 + unsigned int od2, unsigned int od3, 811 unsigned int vid_pll_div, unsigned int vclk_div, 812 unsigned int hdmi_tx_div, unsigned int venc_div, 813 bool hdmi_use_enci, bool vic_alternate_clock) ··· 826 meson_hdmi_pll_generic_set(priv, pll_base_freq); 827 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { 828 switch (pll_base_freq) { 829 + case 2970000000: 830 m = 0x3d; 831 frac = vic_alternate_clock ? 0xd02 : 0xe00; 832 break; 833 + case 4320000000: 834 m = vic_alternate_clock ? 0x59 : 0x5a; 835 frac = vic_alternate_clock ? 0xe8f : 0; 836 break; 837 + case 5940000000: 838 m = 0x7b; 839 frac = vic_alternate_clock ? 0xa05 : 0xc00; 840 break; ··· 844 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || 845 meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { 846 switch (pll_base_freq) { 847 + case 2970000000: 848 m = 0x7b; 849 frac = vic_alternate_clock ? 0x281 : 0x300; 850 break; 851 + case 4320000000: 852 m = vic_alternate_clock ? 0xb3 : 0xb4; 853 frac = vic_alternate_clock ? 0x347 : 0; 854 break; 855 + case 5940000000: 856 m = 0xf7; 857 frac = vic_alternate_clock ? 0x102 : 0x200; 858 break; ··· 861 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); 862 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { 863 switch (pll_base_freq) { 864 + case 2970000000: 865 m = 0x7b; 866 frac = vic_alternate_clock ? 0x140b4 : 0x18000; 867 break; 868 + case 4320000000: 869 m = vic_alternate_clock ? 0xb3 : 0xb4; 870 frac = vic_alternate_clock ? 0x1a3ee : 0; 871 break; 872 + case 5940000000: 873 m = 0xf7; 874 frac = vic_alternate_clock ? 0x8148 : 0x10000; 875 break; ··· 1025 } 1026 1027 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 1028 + unsigned long long phy_freq, unsigned long long vclk_freq, 1029 + unsigned long long venc_freq, unsigned long long dac_freq, 1030 bool hdmi_use_enci) 1031 { 1032 bool vic_alternate_clock = false; 1033 + unsigned long long freq; 1034 + unsigned long long hdmi_tx_div; 1035 + unsigned long long venc_div; 1036 1037 if (target == MESON_VCLK_TARGET_CVBS) { 1038 meson_venci_cvbs_clock_config(priv); ··· 1052 return; 1053 } 1054 1055 + hdmi_tx_div = DIV_ROUND_DOWN_ULL(vclk_freq, dac_freq); 1056 1057 if (hdmi_tx_div == 0) { 1058 + pr_err("Fatal Error, invalid HDMI-TX freq %lluHz\n", 1059 dac_freq); 1060 return; 1061 } 1062 1063 + venc_div = DIV_ROUND_DOWN_ULL(vclk_freq, venc_freq); 1064 1065 if (venc_div == 0) { 1066 + pr_err("Fatal Error, invalid HDMI venc freq %lluHz\n", 1067 venc_freq); 1068 return; 1069 } 1070 1071 for (freq = 0 ; params[freq].pixel_freq ; ++freq) { 1072 if ((phy_freq == params[freq].phy_freq || 1073 + phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) && 1074 (vclk_freq == params[freq].vclk_freq || 1075 + vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) { 1076 if (vclk_freq != params[freq].vclk_freq) 1077 vic_alternate_clock = true; 1078 else ··· 1098 } 1099 1100 if (!params[freq].pixel_freq) { 1101 + pr_err("Fatal Error, invalid HDMI vclk freq %lluHz\n", 1102 + vclk_freq); 1103 return; 1104 } 1105
+7 -6
drivers/gpu/drm/meson/meson_vclk.h
··· 20 }; 21 22 /* 27MHz is the CVBS Pixel Clock */ 23 - #define MESON_VCLK_CVBS 27000 24 25 enum drm_mode_status 26 - meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq); 27 enum drm_mode_status 28 - meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, 29 - unsigned int vclk_freq); 30 31 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 32 - unsigned int phy_freq, unsigned int vclk_freq, 33 - unsigned int venc_freq, unsigned int dac_freq, 34 bool hdmi_use_enci); 35 36 #endif /* __MESON_VCLK_H */
··· 20 }; 21 22 /* 27MHz is the CVBS Pixel Clock */ 23 + #define MESON_VCLK_CVBS (27 * 1000 * 1000) 24 25 enum drm_mode_status 26 + meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq); 27 enum drm_mode_status 28 + meson_vclk_vic_supported_freq(struct meson_drm *priv, 29 + unsigned long long phy_freq, 30 + unsigned long long vclk_freq); 31 32 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 33 + unsigned long long phy_freq, unsigned long long vclk_freq, 34 + unsigned long long venc_freq, unsigned long long dac_freq, 35 bool hdmi_use_enci); 36 37 #endif /* __MESON_VCLK_H */
+2 -2
drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
··· 129 { 130 struct jadard *jadard = panel_to_jadard(panel); 131 132 - gpiod_set_value(jadard->reset, 1); 133 msleep(120); 134 135 if (jadard->desc->reset_before_power_off_vcioo) { 136 - gpiod_set_value(jadard->reset, 0); 137 138 usleep_range(1000, 2000); 139 }
··· 129 { 130 struct jadard *jadard = panel_to_jadard(panel); 131 132 + gpiod_set_value(jadard->reset, 0); 133 msleep(120); 134 135 if (jadard->desc->reset_before_power_off_vcioo) { 136 + gpiod_set_value(jadard->reset, 1); 137 138 usleep_range(1000, 2000); 139 }