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

drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos

Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250)
doesn't report empty level of packer header FIFO. In case of those SoCs,
use the old way of waiting for empty command tranfsfer FIFO, removed
recently by commit 14806c641582 ("drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer").

Fixes: 14806c641582 ("drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer")
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Marek Vasut <marex@denx.de>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230809145641.3213210-1-m.szyprowski@samsung.com

authored by

Marek Szyprowski and committed by
Robert Foss
15f389da 96413b35

+17 -2
+16 -2
drivers/gpu/drm/bridge/samsung-dsim.c
··· 413 413 .m_min = 41, 414 414 .m_max = 125, 415 415 .min_freq = 500, 416 + .has_broken_fifoctrl_emptyhdr = 1, 416 417 }; 417 418 418 419 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { ··· 430 429 .m_min = 41, 431 430 .m_max = 125, 432 431 .min_freq = 500, 432 + .has_broken_fifoctrl_emptyhdr = 1, 433 433 }; 434 434 435 435 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = { ··· 1012 1010 do { 1013 1011 u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); 1014 1012 1015 - if (reg & DSIM_SFR_HEADER_EMPTY) 1016 - return 0; 1013 + if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) { 1014 + if (reg & DSIM_SFR_HEADER_EMPTY) 1015 + return 0; 1016 + } else { 1017 + if (!(reg & DSIM_SFR_HEADER_FULL)) { 1018 + /* 1019 + * Wait a little bit, so the pending data can 1020 + * actually leave the FIFO to avoid overflow. 1021 + */ 1022 + if (!cond_resched()) 1023 + usleep_range(950, 1050); 1024 + return 0; 1025 + } 1026 + } 1017 1027 1018 1028 if (!cond_resched()) 1019 1029 usleep_range(950, 1050);
+1
include/drm/bridge/samsung-dsim.h
··· 53 53 unsigned int plltmr_reg; 54 54 unsigned int has_freqband:1; 55 55 unsigned int has_clklane_stop:1; 56 + unsigned int has_broken_fifoctrl_emptyhdr:1; 56 57 unsigned int num_clks; 57 58 unsigned int min_freq; 58 59 unsigned int max_freq;