According to Table 13-45 of the i.MX8M Mini Reference Manual, the min
and max values for M and  the frequency range for the VCO_out
calculator were incorrect.  This also appears to be the case for the
imx8mn and imx8mp.

To fix this, make new variables to hold the min and max values of m
and the minimum value of VCO_out, and update the PMS calculator to
use these new variables instead of using hard-coded values to keep
the backwards compatibility with other parts using this driver.

Fixes: 4d562c70c4dc ("drm: bridge: samsung-dsim: Add i.MX8M Mini/Nano support")
Signed-off-by: Adam Ford <aford...@gmail.com>
---
 drivers/gpu/drm/bridge/samsung-dsim.c | 22 ++++++++++++++++++++--
 include/drm/bridge/samsung-dsim.h     |  3 +++
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c 
b/drivers/gpu/drm/bridge/samsung-dsim.c
index 1ccbad4ea577..9fec32b44e05 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -406,6 +406,9 @@ static const struct samsung_dsim_driver_data 
exynos3_dsi_driver_data = {
        .num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .m_min = 41,
+       .m_max = 125,
+       .vco_min = 500,
 };
 
 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
@@ -419,6 +422,9 @@ static const struct samsung_dsim_driver_data 
exynos4_dsi_driver_data = {
        .num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .m_min = 41,
+       .m_max = 125,
+       .vco_min = 500,
 };
 
 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
@@ -430,6 +436,9 @@ static const struct samsung_dsim_driver_data 
exynos5_dsi_driver_data = {
        .num_bits_resol = 11,
        .pll_p_offset = 13,
        .reg_values = reg_values,
+       .m_min = 41,
+       .m_max = 125,
+       .vco_min = 500,
 };
 
 static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
@@ -442,6 +451,9 @@ static const struct samsung_dsim_driver_data 
exynos5433_dsi_driver_data = {
        .num_bits_resol = 12,
        .pll_p_offset = 13,
        .reg_values = exynos5433_reg_values,
+       .m_min = 41,
+       .m_max = 125,
+       .vco_min = 500,
 };
 
 static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
@@ -454,6 +466,9 @@ static const struct samsung_dsim_driver_data 
exynos5422_dsi_driver_data = {
        .num_bits_resol = 12,
        .pll_p_offset = 13,
        .reg_values = exynos5422_reg_values,
+       .m_min = 41,
+       .m_max = 125,
+       .vco_min = 500,
 };
 
 static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
@@ -470,6 +485,9 @@ static const struct samsung_dsim_driver_data 
imx8mm_dsi_driver_data = {
         */
        .pll_p_offset = 14,
        .reg_values = imx8mm_dsim_reg_values,
+       .m_min = 64,
+       .m_max = 1023,
+       .vco_min = 1050,
 };
 
 static const struct samsung_dsim_driver_data *
@@ -548,12 +566,12 @@ static unsigned long samsung_dsim_pll_find_pms(struct 
samsung_dsim *dsi,
                        tmp = (u64)fout * (_p << _s);
                        do_div(tmp, fin);
                        _m = tmp;
-                       if (_m < 41 || _m > 125)
+                       if (_m < driver_data->m_min || _m > driver_data->m_max)
                                continue;
 
                        tmp = (u64)_m * fin;
                        do_div(tmp, _p);
-                       if (tmp < 500 * MHZ ||
+                       if (tmp < driver_data->vco_min  * MHZ ||
                            tmp > driver_data->max_freq * MHZ)
                                continue;
 
diff --git a/include/drm/bridge/samsung-dsim.h 
b/include/drm/bridge/samsung-dsim.h
index ba5484de2b30..a088d84579bc 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -59,6 +59,9 @@ struct samsung_dsim_driver_data {
        unsigned int num_bits_resol;
        unsigned int pll_p_offset;
        const unsigned int *reg_values;
+       u16 m_min;
+       u16 m_max;
+       u64 vco_min;
 };
 
 struct samsung_dsim_host_ops {
-- 
2.39.2

Reply via email to