imx-drm: ipuv3-crtc: Implement mode_fixup
Subsystems (5)
cover imx-drm: ipuv3-crtc: Implement mode_fixup
From: Steve Longerbeam <[email protected]>
This patchset implements ->mode_fixup() in the imx ipuv3-crtc driver, using a new support function ipu_di_adjust_videomode(). This new function needs to be subsystem independent, so it accepts a video mode as a 'struct videomode'. Hence ipu-crtc ->mode_fixup() needs another support function to convert a drm_display_mode to a videomode before passing the mode to ipu_di_adjust_videomode() for fixup.
Also some related code cleanup: 'struct ipu_di_signal_cfg' should use 'struct videomode' for mode timings.
Jiada Wang (1):
gpu: ipu-di: Add ipu_di_adjust_videomode()
Steve Longerbeam (5):
gpu: ipu-di: remove some non-functional code
drm_modes: add videomode_from_drm_display_mode
imx-drm: ipuv3-crtc: Implement mode_fixup
imx-drm: encoder mode_set must use adjusted mode
gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
drivers/gpu/drm/drm_modes.c | 40 +++++++++++ drivers/gpu/drm/imx/imx-hdmi.c | 4 +- drivers/gpu/drm/imx/imx-ldb.c | 4 +- drivers/gpu/drm/imx/imx-tve.c | 4 +- drivers/gpu/drm/imx/ipuv3-crtc.c | 39 +++++----- drivers/gpu/drm/imx/parallel-display.c | 4 +- drivers/gpu/ipu-v3/ipu-di.c | 124 ++++++++++++++++++++------------ include/drm/drm_modes.h | 2 + include/video/imx-ipu-v3.h | 21 ++---- 9 files changed, 150 insertions(+), 92 deletions(-)
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 1/6 gpu: ipu-di: Add ipu_di_adjust_videomode()
From: Jiada Wang <[email protected]>
On some monitors, high resolution modes are not working, exhibiting pixel column truncation problems (for example, 1280x1024 displays as 1280x1022).
The function ipu_di_adjust_videomode() aims to fix these issues by adjusting a passed videomode to IPU restrictions. The function can be called from the drm_crtc_helper_funcs->mode_fixup() methods.
--- drivers/gpu/ipu-v3/ipu-di.c | 29 +++++++++++++++++++++++++++++ include/video/imx-ipu-v3.h | 2 ++ 2 files changed, 31 insertions(+)
drivers/gpu/ipu-v3/ipu-di.c +29 -0
@@ -511,6 +511,35 @@ static void ipu_di_config_clock(struct ipu_di *di, clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4)); } +/* +* This function is called to adjust a video mode to IPU restrictions. +* It is meant to be called from drm crtc mode_fixup() methods. +*/ +int ipu_di_adjust_videomode (struct ipu_di *di,struct videomode *mode) +{ +u32 diff; + +if (mode->vfront_porch >=2 ) +return 0 ; + + diff =2 - mode->vfront_porch; + +if (mode->vback_porch >= diff) { + mode->vfront_porch =2 ; + mode->vback_porch -= diff; + }else if (mode->vsync_len > diff) { + mode->vfront_porch =2 ; + mode->vsync_len = mode->vsync_len - diff; + }else { +dev_warn (di->ipu->dev,"failed to adjust videomode\n" ); +return -EINVAL ; + } + +dev_warn (di->ipu->dev,"videomode adapted for IPU restrictions\n" ); +return 0 ; +} +EXPORT_SYMBOL_GPL (ipu_di_adjust_videomode); +int ipu_di_init_sync_panel (struct ipu_di *di,struct ipu_di_signal_cfg *sig) {u32 reg;
include/video/imx-ipu-v3.h +2 -0
@@ -17,6 +17,7 @@#include <linux/bitmap.h> #include <linux/fb.h> #include <media/v4l2-mediabus.h> +#include <video/videomode.h> struct ipu_soc ;
@@ -236,6 +237,7 @@ void ipu_di_put(struct ipu_di *);int ipu_di_disable (struct ipu_di *);int ipu_di_enable (struct ipu_di *);int ipu_di_get_num (struct ipu_di *); +int ipu_di_adjust_videomode (struct ipu_di *di,struct videomode *mode);int ipu_di_init_sync_panel (struct ipu_di *,struct ipu_di_signal_cfg *sig);/*
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
Fabio Estevam
reviewerRe: [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode()
Steve,
Quoted 6 lines · On Mon, Dec 15, 2014 at 10:29 PM, <[email protected]> wrote:
From: Jiada Wang <[email protected]>
On some monitors, high resolution modes are not working, exhibiting pixel column truncation problems (for example, 1280x1024 displays as 1280x1022).
Quoted 7 lines
The function
ipu_di_adjust_videomode()aims to fix these issues by adjusting a passed videomode to IPU restrictions. The function can be called from thedrm_crtc_helper_funcs->mode_fixup()methods.Signed-off-by Jiada Wang <[email protected]>Signed-off-by Deepak Das <[email protected]>Signed-off-by Steve Longerbeam <[email protected]>
Looks like you missed to add Philipp on Cc.
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode()
Quoted 9 lines · Fabio Estevam
Steve,
Quoted 6 lines · On Mon, Dec 15, 2014 at 10:29 PM, <[email protected]> wrote:
From: Jiada Wang <[email protected]>
On some monitors, high resolution modes are not working, exhibiting pixel column truncation problems (for example, 1280x1024 displays as 1280x1022).
Quoted 8 lines
Quoted 7 lines
The function
ipu_di_adjust_videomode()aims to fix these issues by adjusting a passed videomode to IPU restrictions. The function can be called from thedrm_crtc_helper_funcs->mode_fixup()methods.Signed-off-by Jiada Wang <[email protected]>Signed-off-by Deepak Das <[email protected]>Signed-off-by Steve Longerbeam <[email protected]>Looks like you missed to add Philipp on Cc.
Hi Fabio, yes I forgot to add him as a cc:, but I discussed these patches with him before submitting. I will add him to cc in next revision.
Steve
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 2/6 gpu: ipu-di: remove some non-functional code
In reply to [email protected]From: Steve Longerbeam <[email protected]>
h_total and v_total were calculated in ipu_di_init_sync_panel() but never actually used. Remove.
--- drivers/gpu/ipu-v3/ipu-di.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/gpu/ipu-v3/ipu-di.c +0 -6
@@ -545,7 +545,6 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)u32 reg;u32 di_gen, vsync_cnt;u32 div; -u32 h_total, v_total;dev_dbg (di->ipu->dev,"disp %d: panel size = %d x %d\n" , di->id, sig->width, sig->height);
@@ -553,11 +552,6 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)if ((sig->v_sync_width ==0 ) || (sig->h_sync_width ==0 ))return -EINVAL ; - h_total = sig->width + sig->h_sync_width + sig->h_start_width + - sig->h_end_width; - v_total = sig->height + sig->v_sync_width + sig->v_start_width + - sig->v_end_width; - dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n", clk_get_rate(di->clk_ipu), clk_get_rate(di->clk_di),
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 3/6 drm_modes: add videomode_from_drm_display_mode
In reply to [email protected]From: Steve Longerbeam <[email protected]>
Add conversion from drm_display_mode to videomode.
--- drivers/gpu/drm/drm_modes.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/drm/drm_modes.h | 2 ++ 2 files changed, 42 insertions(+)
drivers/gpu/drm/drm_modes.c +40 -0
@@ -615,6 +615,46 @@ void drm_display_mode_from_videomode(const struct videomode *vm, }EXPORT_SYMBOL_GPL (drm_display_mode_from_videomode); +/** +* videomode_from_drm_display_mode - fill in @vm using @dmode, +* @dmode: drm_display_mode structure to use as source +* @vm: videomode structure to use as destination +* +* Fills out @vm using the display mode specified in @dmode. +*/ +void videomode_from_drm_display_mode (const struct drm_display_mode *dmode, +struct videomode *vm) +{ + vm->hactive = dmode->hdisplay; + vm->hfront_porch = dmode->hsync_start - dmode->hdisplay; + vm->hsync_len = dmode->hsync_end - dmode->hsync_start; + vm->hback_porch = dmode->htotal - dmode->hsync_end; + + vm->vactive = dmode->vdisplay; + vm->vfront_porch = dmode->vsync_start - dmode->vdisplay; + vm->vsync_len = dmode->vsync_end - dmode->vsync_start; + vm->vback_porch = dmode->vtotal - dmode->vsync_end; + + vm->pixelclock = dmode->clock *1000 ; + + vm->flags =0 ; +if (dmode->flags &DRM_MODE_FLAG_PHSYNC ) + vm->flags |=DISPLAY_FLAGS_HSYNC_HIGH ; +else if (dmode->flags &DRM_MODE_FLAG_NHSYNC ) + vm->flags |=DISPLAY_FLAGS_HSYNC_LOW ; +if (dmode->flags &DRM_MODE_FLAG_PVSYNC ) + vm->flags |=DISPLAY_FLAGS_VSYNC_HIGH ; +else if (dmode->flags &DRM_MODE_FLAG_NVSYNC ) + vm->flags |=DISPLAY_FLAGS_VSYNC_LOW ; +if (dmode->flags &DRM_MODE_FLAG_INTERLACE ) + vm->flags |=DISPLAY_FLAGS_INTERLACED ; +if (dmode->flags &DRM_MODE_FLAG_DBLSCAN ) + vm->flags |=DISPLAY_FLAGS_DOUBLESCAN ; +if (dmode->flags &DRM_MODE_FLAG_DBLCLK ) + vm->flags |=DISPLAY_FLAGS_DOUBLECLK ; +} +EXPORT_SYMBOL_GPL (videomode_from_drm_display_mode); +#ifdef CONFIG_OF /** * of_get_drm_display_mode - get a drm_display_mode from devicetree
include/drm/drm_modes.h +2 -0
@@ -197,6 +197,8 @@ struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, int GTF_K, int GTF_2J);void drm_display_mode_from_videomode (const struct videomode *vm,struct drm_display_mode *dmode); +void videomode_from_drm_display_mode (const struct drm_display_mode *dmode, +struct videomode *vm);int of_get_drm_display_mode (struct device_node *np,struct drm_display_mode *dmode,int index);
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 4/6 imx-drm: ipuv3-crtc: Implement mode_fixup
In reply to [email protected]From: Steve Longerbeam <[email protected]>
Ask the IPU display interface, via ipu_di_adjust_videomode(), to adjust a video mode to meet any DI restrictions. The function takes a subsystem independent videomode, so the drm_display_mode must be converted to videomode first, and then the adjusted mode converted back to a drm_display_mode.
--- drivers/gpu/drm/imx/ipuv3-crtc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/imx/ipuv3-crtc.c +12 -0
@@ -242,6 +242,18 @@ static bool ipu_crtc_mode_fixup(struct drm_crtc *crtc,const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { + struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); +struct videomode vm; +int ret; + +videomode_from_drm_display_mode (adjusted_mode, &vm); + + ret =ipu_di_adjust_videomode (ipu_crtc->di, &vm); +if (ret) +return false; + +drm_display_mode_from_videomode (&vm, adjusted_mode); +return true; }
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 5/6 imx-drm: encoder mode_set must use adjusted mode
In reply to [email protected]From: Steve Longerbeam <[email protected]>
The encoder ->mode_set() methods need to use the hw adjusted mode, not the original mode.
--- drivers/gpu/drm/imx/imx-hdmi.c | 4 ++-- drivers/gpu/drm/imx/imx-ldb.c | 4 ++-- drivers/gpu/drm/imx/imx-tve.c | 4 ++-- drivers/gpu/drm/imx/parallel-display.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-)
drivers/gpu/drm/imx/imx-hdmi.c +2 -2
@@ -1417,8 +1417,8 @@ static struct drm_encoder *imx_hdmi_connector_best_encoder(struct drm_connector }static void imx_hdmi_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) { struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
drivers/gpu/drm/imx/imx-ldb.c +2 -2
@@ -246,8 +246,8 @@ static void imx_ldb_encoder_commit(struct drm_encoder *encoder) }static void imx_ldb_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) {struct imx_ldb_channel *imx_ldb_ch =enc_to_imx_ldb_ch (encoder);struct imx_ldb *ldb = imx_ldb_ch->ldb;
drivers/gpu/drm/imx/imx-tve.c +2 -2
@@ -312,8 +312,8 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder) }static void imx_tve_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) {struct imx_tve *tve =enc_to_tve (encoder);unsigned long rounded_rate;
drivers/gpu/drm/imx/parallel-display.c +2 -2
@@ -131,8 +131,8 @@ static void imx_pd_encoder_commit(struct drm_encoder *encoder) }static void imx_pd_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) { }
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
Philipp Zabel
maintainerRe: [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode
Am Montag, den 15.12.2014, 16:29 -0800 schrieb [email protected]:
drivers/gpu/drm/imx/imx-ldb.c
Quoted 32 lines
From: Steve Longerbeam <[email protected]>
The encoder ->mode_set() methods need to use the hw adjusted mode, not the original mode.
Signed-off-by Steve Longerbeam <[email protected]>--- drivers/gpu/drm/imx/imx-hdmi.c | 4 ++-- drivers/gpu/drm/imx/imx-ldb.c | 4 ++-- drivers/gpu/drm/imx/imx-tve.c | 4 ++-- drivers/gpu/drm/imx/parallel-display.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-)drivers/gpu/drm/imx/imx-hdmi.c +2
-2@@ -1417,8 +1417,8 @@ static struct drm_encoder *imx_hdmi_connector_best_encoder(struct drm_connector }static void imx_hdmi_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) { struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);drivers/gpu/drm/imx/imx-ldb.c +0
-0
There's another line that should be changed
- struct drm_display_mode *mode = &encoder->crtc->mode;
+ struct drm_display_mode *mode = &encoder->crtc->hwmode;
in imx_ldb_encoder_prepare.
drivers/gpu/drm/imx/imx-ldb.c static void imx_ldb_encoder_commit(struct drm_encoder *encoder) · line 253
Quoted 11 lines
drivers/gpu/drm/imx/imx-ldb.c +2
-2@@ -246,8 +246,8 @@ static void imx_ldb_encoder_commit(struct drm_encoder *encoder) }static void imx_ldb_encoder_mode_set (struct drm_encoder *encoder, -struct drm_display_mode *mode, -struct drm_display_mode *adjusted_mode) +struct drm_display_mode *orig_mode, +struct drm_display_mode *mode) {struct imx_ldb_channel *imx_ldb_ch =enc_to_imx_ldb_ch (encoder);struct imx_ldb *ldb = imx_ldb_ch->ldb;
regards
Philipp
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode
Quoted 7 lines · Philipp Zabel
There's another line that should be changed
(quoted diff) +1
-1- struct drm_display_mode *mode = &encoder->crtc->mode; + struct drm_display_mode *mode = &encoder->crtc->hwmode;in
imx_ldb_encoder_prepare.
done.
Steve
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 6/6 gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
In reply to [email protected]From: Steve Longerbeam <[email protected]>
This patch changes struct ipu_di_signal_cfg to use struct videomode to define video timings and flags.
--- drivers/gpu/drm/imx/ipuv3-crtc.c | 27 +++--------- drivers/gpu/ipu-v3/ipu-di.c | 89 ++++++++++++++++++++------------------ include/video/imx-ipu-v3.h | 19 ++------ 3 files changed, 57 insertions(+), 78 deletions(-)
drivers/gpu/drm/imx/ipuv3-crtc.c +6 -21
@@ -158,35 +158,20 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc, out_pixel_fmt = ipu_crtc->interface_pix_fmt; -if (mode->flags &DRM_MODE_FLAG_INTERLACE ) - sig_cfg.interlaced =1 ; -if (mode->flags &DRM_MODE_FLAG_PHSYNC ) - sig_cfg.Hsync_pol =1 ; -if (mode->flags &DRM_MODE_FLAG_PVSYNC ) - sig_cfg.Vsync_pol =1 ; - sig_cfg.enable_pol =1 ; sig_cfg.clk_pol =0 ; - sig_cfg.width = mode->hdisplay; - sig_cfg.height = mode->vdisplay; sig_cfg.pixel_fmt = out_pixel_fmt; - sig_cfg.h_start_width = mode->htotal - mode->hsync_end; - sig_cfg.h_sync_width = mode->hsync_end - mode->hsync_start; - sig_cfg.h_end_width = mode->hsync_start - mode->hdisplay; - - sig_cfg.v_start_width = mode->vtotal - mode->vsync_end; - sig_cfg.v_sync_width = mode->vsync_end - mode->vsync_start; - sig_cfg.v_end_width = mode->vsync_start - mode->vdisplay; - sig_cfg.pixelclock = mode->clock *1000 ; sig_cfg.clkflags = ipu_crtc->di_clkflags; - sig_cfg.v_to_h_sync =0 ; - sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin; sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin; - ret =ipu_dc_init_sync (ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced, - out_pixel_fmt, mode->hdisplay); +videomode_from_drm_display_mode (mode, &sig_cfg.mode); + + ret =ipu_dc_init_sync (ipu_crtc->dc, ipu_crtc->di, + (mode->flags &DRM_MODE_FLAG_INTERLACE ) ? + true : false, + out_pixel_fmt, mode->hdisplay);if (ret) { dev_err(ipu_crtc->dev, "initializing display controller failed with %d\n",
drivers/gpu/ipu-v3/ipu-di.c +48 -41
242 lines not on this page · raw message
include/video/imx-ipu-v3.h +3 -16
@@ -33,28 +33,15 @@ enum ipuv3_type {* Bitfield of Display Interface signal polarities. */ struct ipu_di_signal_cfg { -unsigned datamask_en:1 ; -unsigned interlaced:1 ; -unsigned odd_field_first:1 ; -unsigned clksel_en:1 ; -unsigned clkidle_en:1 ;unsigned data_pol:1 ;/* true = inverted */ unsigned clk_pol:1 ;/* true = rising edge */ unsigned enable_pol:1 ; -unsigned Hsync_pol:1 ;/* true = active high */ -unsigned Vsync_pol:1 ; -u16 width; -u16 height; +struct videomode mode; +u32 pixel_fmt; -u16 h_start_width; -u16 h_sync_width; -u16 h_end_width; -u16 v_start_width; -u16 v_sync_width; -u16 v_end_width;u32 v_to_h_sync; -unsigned long pixelclock; +#define IPU_DI_CLKMODE_SYNC (1 << 0)#define IPU_DI_CLKMODE_EXT (1 << 1)unsigned long clkflags;
Signature · 6 lines
1.7.9.5 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
Philipp Zabel
maintainerRe: [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
Hi Steve,
I think this is a good idea. Two small comments below.
Am Montag, den 15.12.2014, 16:29 -0800 schrieb [email protected]:
Quoted 44 lines
From: Steve Longerbeam <[email protected]>
This patch changes struct
ipu_di_signal_cfgto use struct videomode to define video timings and flags.Signed-off-by Steve Longerbeam <[email protected]>--- drivers/gpu/drm/imx/ipuv3-crtc.c | 27 +++--------- drivers/gpu/ipu-v3/ipu-di.c | 89 ++++++++++++++++++++------------------ include/video/imx-ipu-v3.h | 19 ++------ 3 files changed, 57 insertions(+), 78 deletions(-)drivers/gpu/drm/imx/ipuv3-crtc.c +0
-19@@ -158,35 +158,20 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc, out_pixel_fmt = ipu_crtc->interface_pix_fmt; -if (mode->flags &DRM_MODE_FLAG_INTERLACE ) - sig_cfg.interlaced =1 ; -if (mode->flags &DRM_MODE_FLAG_PHSYNC ) - sig_cfg.Hsync_pol =1 ; -if (mode->flags &DRM_MODE_FLAG_PVSYNC ) - sig_cfg.Vsync_pol =1 ; - sig_cfg.enable_pol =1 ; sig_cfg.clk_pol =0 ; - sig_cfg.width = mode->hdisplay; - sig_cfg.height = mode->vdisplay; sig_cfg.pixel_fmt = out_pixel_fmt; - sig_cfg.h_start_width = mode->htotal - mode->hsync_end; - sig_cfg.h_sync_width = mode->hsync_end - mode->hsync_start; - sig_cfg.h_end_width = mode->hsync_start - mode->hdisplay; - - sig_cfg.v_start_width = mode->vtotal - mode->vsync_end; - sig_cfg.v_sync_width = mode->vsync_end - mode->vsync_start; - sig_cfg.v_end_width = mode->vsync_start - mode->vdisplay; - sig_cfg.pixelclock = mode->clock *1000 ; sig_cfg.clkflags = ipu_crtc->di_clkflags; - sig_cfg.v_to_h_sync =0 ; -
drivers/gpu/drm/imx/ipuv3-crtc.c static int ipu_crtc_mode_set(struct drm_crtc *crtc, · line 173
Quoted 10 lines
drivers/gpu/drm/imx/ipuv3-crtc.c +5
-2sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin; sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin; - ret =ipu_dc_init_sync (ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced, - out_pixel_fmt, mode->hdisplay); +videomode_from_drm_display_mode (mode, &sig_cfg.mode); + + ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, + (mode->flags & DRM_MODE_FLAG_INTERLACE) ? + true : false,
The interlaced parameter to ipu_dc_init_sync is of type bool, so the ()?true:false is superfluous.
[...]
drivers/gpu/drm/imx/ipuv3-crtc.c static void ipu_di_config_clock(struct ipu_di *di, · line 444
Quoted 11 lines
drivers/gpu/drm/imx/ipuv3-crtc.c +3
-2@@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,unsigned long in_rate;unsigned div; -clk_set_rate (clk, sig->pixelclock); +clk_set_rate (clk, sig->mode.pixelclock); in_rate =clk_get_rate (clk); - div = (in_rate + sig->pixelclock /2 ) / sig->pixelclock; + div = (in_rate + sig->mode.pixelclock /2 ) / + sig->mode.pixelclock;
Let's use this opportunity to switch to DIV_ROUND_CLOSEST here ...
drivers/gpu/drm/imx/ipuv3-crtc.c static void ipu_di_config_clock(struct ipu_di *di, · line 486
Quoted 11 lines
drivers/gpu/drm/imx/ipuv3-crtc.c +3
-2@@ -473,10 +479,11 @@ static void ipu_di_config_clock(struct ipu_di *di, clk = di->clk_di; -clk_set_rate (clk, sig->pixelclock); +clk_set_rate (clk, sig->mode.pixelclock); in_rate =clk_get_rate (clk); - div = (in_rate + sig->pixelclock /2 ) / sig->pixelclock; + div = (in_rate + sig->mode.pixelclock /2 ) / + sig->mode.pixelclock;
... and here.
regards
Philipp
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
Quoted 3 lines · Philipp Zabel
The interlaced parameter to
ipu_dc_init_syncis of type bool, so the ()?true:false is superfluous.
fixed.
Quoted 6 lines
[...]
Quoted 4 lines
drivers/gpu/ipu-v3/ipu-di.c +0
-0@@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,unsigned long in_rate;unsigned div;
Quoted 8 lines
drivers/gpu/ipu-v3/ipu-di.c static void ipu_di_config_clock(struct ipu_di *di, · line 444
Quoted 7 lines
drivers/gpu/ipu-v3/ipu-di.c +3
-2-clk_set_rate (clk, sig->pixelclock); +clk_set_rate (clk, sig->mode.pixelclock); in_rate =clk_get_rate (clk); - div = (in_rate + sig->pixelclock /2 ) / sig->pixelclock; + div = (in_rate + sig->mode.pixelclock /2 ) / + sig->mode.pixelclock;Let's use this opportunity to switch to
DIV_ROUND_CLOSESThere ...
I'll add a separate patch for that.
Steve
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
Philipp Zabel
maintainerHi Steve,
Please put me on Cc: for IPU and imx-drm related patches.
Am Montag, den 15.12.2014, 16:29 -0800 schrieb [email protected]:
Quoted 11 lines
From: Steve Longerbeam <[email protected]>
This patchset implements ->mode_fixup() in the imx ipuv3-crtc driver, using a new support function
ipu_di_adjust_videomode(). This new function needs to be subsystem independent, so it accepts a video mode as a 'struct videomode'. Hence ipu-crtc ->mode_fixup() needs another support function to convert adrm_display_modeto a videomode before passing the mode toipu_di_adjust_videomode()for fixup.Also some related code cleanup: 'struct
ipu_di_signal_cfg' should use 'struct videomode' for mode timings.
I have tested the video mode adjustment on an LVDS panel (that doesn't care about the actual front/back porches and allows a wide range of timings) and verified it fixes the problem of the display randomly turning off with some timings.
regards
Philipp
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel