All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Paul <seanpaul@chromium.org>
To: Shawn Guo <shawnguo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>,
	devicetree@vger.kernel.org,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Baoyou Xie <xie.baoyou@zte.com.cn>,
	dri-devel@lists.freedesktop.org, Rob Herring <robh+dt@kernel.org>,
	Jun Nie <jun.nie@linaro.org>
Subject: Re: [PATCH 3/5] drm: zte: add function to configure vou_ctrl dividers
Date: Mon, 23 Jan 2017 10:47:09 -0500	[thread overview]
Message-ID: <20170123154709.GD19505@trickycodes.roam.corp.google.com> (raw)
In-Reply-To: <1484843100-16284-4-git-send-email-shawnguo@kernel.org>

On Fri, Jan 20, 2017 at 12:24:58AM +0800, Shawn Guo wrote:
> From: Shawn Guo <shawn.guo@linaro.org>
> 
> The clock control module (CRM) cannot always provide desired frequency
> for all VOU output devices.  That's why VOU integrates a few dividers
> to further divide the clocks from CRM.  Let's add an interface for
> configuring these dividers.
> 

Reviewed-by: Sean Paul <seanpaul@chromium.org>

> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
> ---
>  drivers/gpu/drm/zte/zx_vou.c      | 79 +++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/zte/zx_vou.h      | 25 +++++++++++++
>  drivers/gpu/drm/zte/zx_vou_regs.h | 16 ++++++++
>  3 files changed, 120 insertions(+)
> 
> diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c
> index c48704b4425a..98f0f51f9748 100644
> --- a/drivers/gpu/drm/zte/zx_vou.c
> +++ b/drivers/gpu/drm/zte/zx_vou.c
> @@ -72,6 +72,13 @@ struct zx_crtc_bits {
>  	u32 sec_vactive_mask;
>  	u32 interlace_select;
>  	u32 pi_enable;
> +	u32 div_vga_shift;
> +	u32 div_pic_shift;
> +	u32 div_tvenc_shift;
> +	u32 div_hdmi_pnx_shift;
> +	u32 div_hdmi_shift;
> +	u32 div_inf_shift;
> +	u32 div_layer_shift;
>  };
>  
>  static const struct zx_crtc_bits main_crtc_bits = {
> @@ -83,6 +90,13 @@ struct zx_crtc_bits {
>  	.sec_vactive_mask = SEC_VACT_MAIN_MASK,
>  	.interlace_select = MAIN_INTERLACE_SEL,
>  	.pi_enable = MAIN_PI_EN,
> +	.div_vga_shift = VGA_MAIN_DIV_SHIFT,
> +	.div_pic_shift = PIC_MAIN_DIV_SHIFT,
> +	.div_tvenc_shift = TVENC_MAIN_DIV_SHIFT,
> +	.div_hdmi_pnx_shift = HDMI_MAIN_PNX_DIV_SHIFT,
> +	.div_hdmi_shift = HDMI_MAIN_DIV_SHIFT,
> +	.div_inf_shift = INF_MAIN_DIV_SHIFT,
> +	.div_layer_shift = LAYER_MAIN_DIV_SHIFT,
>  };
>  
>  static const struct zx_crtc_bits aux_crtc_bits = {
> @@ -94,6 +108,13 @@ struct zx_crtc_bits {
>  	.sec_vactive_mask = SEC_VACT_AUX_MASK,
>  	.interlace_select = AUX_INTERLACE_SEL,
>  	.pi_enable = AUX_PI_EN,
> +	.div_vga_shift = VGA_AUX_DIV_SHIFT,
> +	.div_pic_shift = PIC_AUX_DIV_SHIFT,
> +	.div_tvenc_shift = TVENC_AUX_DIV_SHIFT,
> +	.div_hdmi_pnx_shift = HDMI_AUX_PNX_DIV_SHIFT,
> +	.div_hdmi_shift = HDMI_AUX_DIV_SHIFT,
> +	.div_inf_shift = INF_AUX_DIV_SHIFT,
> +	.div_layer_shift = LAYER_AUX_DIV_SHIFT,
>  };
>  
>  struct zx_crtc {
> @@ -220,6 +241,64 @@ void vou_inf_disable(enum vou_inf_id id, struct drm_crtc *crtc)
>  	zx_writel_mask(vou->vouctl + VOU_CLK_EN, inf->clocks_en_bits, 0);
>  }
>  
> +void zx_vou_config_dividers(struct drm_crtc *crtc,
> +			    struct vou_div_config *configs, int num)
> +{
> +	struct zx_crtc *zcrtc = to_zx_crtc(crtc);
> +	struct zx_vou_hw *vou = zcrtc->vou;
> +	const struct zx_crtc_bits *bits = zcrtc->bits;
> +	int i;
> +
> +	/* Clear update flag bit */
> +	zx_writel_mask(vou->vouctl + VOU_DIV_PARA, DIV_PARA_UPDATE, 0);
> +
> +	for (i = 0; i < num; i++) {
> +		struct vou_div_config *cfg = configs + i;
> +		u32 reg, shift;
> +
> +		switch (cfg->id) {
> +		case VOU_DIV_VGA:
> +			reg = VOU_CLK_SEL;
> +			shift = bits->div_vga_shift;
> +			break;
> +		case VOU_DIV_PIC:
> +			reg = VOU_CLK_SEL;
> +			shift = bits->div_pic_shift;
> +			break;
> +		case VOU_DIV_TVENC:
> +			reg = VOU_DIV_PARA;
> +			shift = bits->div_tvenc_shift;
> +			break;
> +		case VOU_DIV_HDMI_PNX:
> +			reg = VOU_DIV_PARA;
> +			shift = bits->div_hdmi_pnx_shift;
> +			break;
> +		case VOU_DIV_HDMI:
> +			reg = VOU_DIV_PARA;
> +			shift = bits->div_hdmi_shift;
> +			break;
> +		case VOU_DIV_INF:
> +			reg = VOU_DIV_PARA;
> +			shift = bits->div_inf_shift;
> +			break;
> +		case VOU_DIV_LAYER:
> +			reg = VOU_DIV_PARA;
> +			shift = bits->div_layer_shift;
> +			break;
> +		default:
> +			continue;
> +		}
> +
> +		/* Each divider occupies 3 bits */
> +		zx_writel_mask(vou->vouctl + reg, 0x7 << shift,
> +			       cfg->val << shift);
> +	}
> +
> +	/* Set update flag bit to get dividers effected */
> +	zx_writel_mask(vou->vouctl + VOU_DIV_PARA, DIV_PARA_UPDATE,
> +		       DIV_PARA_UPDATE);
> +}
> +
>  static inline void vou_chn_set_update(struct zx_crtc *zcrtc)
>  {
>  	zx_writel(zcrtc->chnreg + CHN_UPDATE, 1);
> diff --git a/drivers/gpu/drm/zte/zx_vou.h b/drivers/gpu/drm/zte/zx_vou.h
> index a41a0ad49857..0dae4faefac4 100644
> --- a/drivers/gpu/drm/zte/zx_vou.h
> +++ b/drivers/gpu/drm/zte/zx_vou.h
> @@ -33,6 +33,31 @@ enum vou_inf_data_sel {
>  void vou_inf_enable(enum vou_inf_id id, struct drm_crtc *crtc);
>  void vou_inf_disable(enum vou_inf_id id, struct drm_crtc *crtc);
>  
> +enum vou_div_id {
> +	VOU_DIV_VGA,
> +	VOU_DIV_PIC,
> +	VOU_DIV_TVENC,
> +	VOU_DIV_HDMI_PNX,
> +	VOU_DIV_HDMI,
> +	VOU_DIV_INF,
> +	VOU_DIV_LAYER,
> +};
> +
> +enum vou_div_val {
> +	VOU_DIV_1 = 0,
> +	VOU_DIV_2 = 1,
> +	VOU_DIV_4 = 3,
> +	VOU_DIV_8 = 7,
> +};
> +
> +struct vou_div_config {
> +	enum vou_div_id id;
> +	enum vou_div_val val;
> +};
> +
> +void zx_vou_config_dividers(struct drm_crtc *crtc,
> +			    struct vou_div_config *configs, int num);
> +
>  int zx_vou_enable_vblank(struct drm_device *drm, unsigned int pipe);
>  void zx_vou_disable_vblank(struct drm_device *drm, unsigned int pipe);
>  
> diff --git a/drivers/gpu/drm/zte/zx_vou_regs.h b/drivers/gpu/drm/zte/zx_vou_regs.h
> index e6ed844e068a..552772137cf0 100644
> --- a/drivers/gpu/drm/zte/zx_vou_regs.h
> +++ b/drivers/gpu/drm/zte/zx_vou_regs.h
> @@ -176,11 +176,27 @@
>  #define VOU_INF_DATA_SEL		0x08
>  #define VOU_SOFT_RST			0x14
>  #define VOU_CLK_SEL			0x18
> +#define VGA_AUX_DIV_SHIFT		29
> +#define VGA_MAIN_DIV_SHIFT		26
> +#define PIC_MAIN_DIV_SHIFT		23
> +#define PIC_AUX_DIV_SHIFT		20
>  #define VOU_CLK_VL2_SEL			BIT(8)
>  #define VOU_CLK_VL1_SEL			BIT(7)
>  #define VOU_CLK_VL0_SEL			BIT(6)
>  #define VOU_CLK_GL1_SEL			BIT(5)
>  #define VOU_CLK_GL0_SEL			BIT(4)
> +#define VOU_DIV_PARA			0x1c
> +#define DIV_PARA_UPDATE			BIT(31)
> +#define TVENC_AUX_DIV_SHIFT		28
> +#define HDMI_AUX_PNX_DIV_SHIFT		25
> +#define HDMI_MAIN_PNX_DIV_SHIFT		22
> +#define HDMI_AUX_DIV_SHIFT		19
> +#define HDMI_MAIN_DIV_SHIFT		16
> +#define TVENC_MAIN_DIV_SHIFT		13
> +#define INF_AUX_DIV_SHIFT		9
> +#define INF_MAIN_DIV_SHIFT		6
> +#define LAYER_AUX_DIV_SHIFT		3
> +#define LAYER_MAIN_DIV_SHIFT		0
>  #define VOU_CLK_REQEN			0x20
>  #define VOU_CLK_EN			0x24
>  
> -- 
> 1.9.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2017-01-23 15:47 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-19 16:24 [PATCH 0/5] Add TV Encoder support for ZTE DRM driver Shawn Guo
2017-01-19 16:24 ` [PATCH 1/5] drm: zte: add interlace mode support Shawn Guo
     [not found]   ` <1484843100-16284-2-git-send-email-shawnguo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-01-23 15:19     ` Sean Paul
     [not found]       ` <20170123151901.GA19505-6JpoNmjd1+aEBhuJAZrboHoUN1GumTyQ7j82oEJ37pA@public.gmane.org>
2017-01-26  3:14         ` Shawn Guo
2017-01-19 16:24 ` [PATCH 2/5] drm: zte: move struct vou_inf into zx_vou driver Shawn Guo
     [not found]   ` <1484843100-16284-3-git-send-email-shawnguo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-01-23 15:30     ` Sean Paul
2017-01-19 16:24 ` [PATCH 3/5] drm: zte: add function to configure vou_ctrl dividers Shawn Guo
2017-01-23 15:47   ` Sean Paul [this message]
2017-01-19 16:24 ` [PATCH 4/5] dt: add bindings for ZTE tvenc device Shawn Guo
2017-01-19 17:11   ` Lucas Stach
2017-01-23  1:33     ` Shawn Guo
     [not found]   ` <1484843100-16284-5-git-send-email-shawnguo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-01-23 14:46     ` Rob Herring
2017-01-19 16:25 ` [PATCH 5/5] drm: zte: add tvenc driver support Shawn Guo
2017-01-23 16:10   ` Sean Paul
     [not found]     ` <20170123161034.GE19505-6JpoNmjd1+aEBhuJAZrboHoUN1GumTyQ7j82oEJ37pA@public.gmane.org>
2017-01-26 15:06       ` Shawn Guo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170123154709.GD19505@trickycodes.roam.corp.google.com \
    --to=seanpaul@chromium.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jun.nie@linaro.org \
    --cc=mark.rutland@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=shawnguo@kernel.org \
    --cc=xie.baoyou@zte.com.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.