summaryrefslogtreecommitdiff
path: root/drivers/gpu/imx/dpu
diff options
context:
space:
mode:
authorOliver Brown <oliver.brown@nxp.com>2018-05-03 12:26:35 -0500
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit5b8ef124e31338d3b5cdfdb4e09be2b8551297ec (patch)
tree653319f0285fe488d5e29cdda5b74cf40f574395 /drivers/gpu/imx/dpu
parentf77ea741134dc529adc069f44ce43c11a40578ba (diff)
MLK-18195 gpu: imx: dpu: framegen: Correct PLL rate to get proper pclk rate
This patch corrects pixel clock PLL rate calculation. Signed-off-by: Oliver Brown <oliver.brown@nxp.com>
Diffstat (limited to 'drivers/gpu/imx/dpu')
-rw-r--r--drivers/gpu/imx/dpu/dpu-framegen.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/drivers/gpu/imx/dpu/dpu-framegen.c b/drivers/gpu/imx/dpu/dpu-framegen.c
index fb4ff105fd6f..3e7655989ab6 100644
--- a/drivers/gpu/imx/dpu/dpu-framegen.c
+++ b/drivers/gpu/imx/dpu/dpu-framegen.c
@@ -97,6 +97,7 @@ typedef enum {
#define FGSRFTD 0x94
#define KHZ 1000
+#define PLL_MIN_FREQ_HZ 648000000
struct dpu_framegen {
void __iomem *base;
@@ -221,11 +222,11 @@ EXPORT_SYMBOL_GPL(framegen_shdtokgen);
void framegen_cfg_videomode(struct dpu_framegen *fg, struct drm_display_mode *m)
{
- const struct dpu_devtype *devtype = fg->dpu->devtype;
u32 hact, htotal, hsync, hsbp;
u32 vact, vtotal, vsync, vsbp;
u32 val;
unsigned long disp_clock_rate, pll_clock_rate = 0;
+ int div = 0;
hact = m->crtc_hdisplay;
htotal = m->crtc_htotal;
@@ -271,21 +272,11 @@ void framegen_cfg_videomode(struct dpu_framegen *fg, struct drm_display_mode *m)
disp_clock_rate = m->clock * 1000;
- if (devtype->version == DPU_V1) {
- /* FIXME: why the folders */
- if (disp_clock_rate > 150000000)
- pll_clock_rate = disp_clock_rate * 2;
- else if (disp_clock_rate > 75000000)
- pll_clock_rate = disp_clock_rate * 4;
- else
- pll_clock_rate = disp_clock_rate * 8;
- } else if (devtype->version == DPU_V2) {
- /* FIXME: why the hardcoded clock rate */
- if (disp_clock_rate > 75000000)
- pll_clock_rate = 1188000000;
- else
- pll_clock_rate = disp_clock_rate * 8;
- }
+ /* find an even divisor for PLL */
+ do {
+ div += 2;
+ pll_clock_rate = disp_clock_rate * div;
+ } while (pll_clock_rate < PLL_MIN_FREQ_HZ);
/*
* To workaround setting clock rate failure issue