Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ecea269 authored by Russell King's avatar Russell King
Browse files

drm/armada: move variant initialisation to CRTC init



Move the variant initialisation entirely to the CRTC init function -
the variant support is really about the CRTC properties than the whole
system, and we want to treat each CRTC individually when we support DT.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent d0165407
Loading
Loading
Loading
Loading
+8 −11
Original line number Original line Diff line number Diff line
@@ -15,20 +15,19 @@
#include "armada_drm.h"
#include "armada_drm.h"
#include "armada_hw.h"
#include "armada_hw.h"


static int armada510_init(struct armada_private *priv, struct device *dev)
static int armada510_crtc_init(struct armada_crtc *dcrtc, struct device *dev)
{
{
	priv->extclk[0] = devm_clk_get(dev, "ext_ref_clk_1");
	struct clk *clk;


	if (IS_ERR(priv->extclk[0]) && PTR_ERR(priv->extclk[0]) == -ENOENT)
	clk = devm_clk_get(dev, "ext_ref_clk_1");
		priv->extclk[0] = ERR_PTR(-EPROBE_DEFER);
	if (IS_ERR(clk))
		return PTR_ERR(clk) == -ENOENT ? -EPROBE_DEFER : PTR_ERR(clk);


	return PTR_RET(priv->extclk[0]);
	dcrtc->extclk[0] = clk;
}


static int armada510_crtc_init(struct armada_crtc *dcrtc)
{
	/* Lower the watermark so to eliminate jitter at higher bandwidths */
	/* Lower the watermark so to eliminate jitter at higher bandwidths */
	armada_updatel(0x20, (1 << 11) | 0xff, dcrtc->base + LCD_CFG_RDREG4F);
	armada_updatel(0x20, (1 << 11) | 0xff, dcrtc->base + LCD_CFG_RDREG4F);

	return 0;
	return 0;
}
}


@@ -45,8 +44,7 @@ static int armada510_crtc_init(struct armada_crtc *dcrtc)
static int armada510_crtc_compute_clock(struct armada_crtc *dcrtc,
static int armada510_crtc_compute_clock(struct armada_crtc *dcrtc,
	const struct drm_display_mode *mode, uint32_t *sclk)
	const struct drm_display_mode *mode, uint32_t *sclk)
{
{
	struct armada_private *priv = dcrtc->crtc.dev->dev_private;
	struct clk *clk = dcrtc->extclk[0];
	struct clk *clk = priv->extclk[0];
	int ret;
	int ret;


	if (dcrtc->num == 1)
	if (dcrtc->num == 1)
@@ -81,7 +79,6 @@ static int armada510_crtc_compute_clock(struct armada_crtc *dcrtc,
const struct armada_variant armada510_ops = {
const struct armada_variant armada510_ops = {
	.has_spu_adv_reg = true,
	.has_spu_adv_reg = true,
	.spu_adv_reg = ADV_HWC32ENABLE | ADV_HWC32ARGB | ADV_HWC32BLEND,
	.spu_adv_reg = ADV_HWC32ENABLE | ADV_HWC32ARGB | ADV_HWC32BLEND,
	.init = armada510_init,
	.crtc_init = armada510_crtc_init,
	.crtc_init = armada510_crtc_init,
	.crtc_compute_clock = armada510_crtc_compute_clock,
	.crtc_compute_clock = armada510_crtc_compute_clock,
};
};
+1 −1
Original line number Original line Diff line number Diff line
@@ -1108,7 +1108,7 @@ int armada_drm_crtc_create(struct drm_device *dev, struct resource *res,
	}
	}


	if (priv->variant->crtc_init) {
	if (priv->variant->crtc_init) {
		ret = priv->variant->crtc_init(dcrtc);
		ret = priv->variant->crtc_init(dcrtc, dev->dev);
		if (ret) {
		if (ret) {
			kfree(dcrtc);
			kfree(dcrtc);
			return ret;
			return ret;
+1 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ struct armada_crtc {
	unsigned		num;
	unsigned		num;
	void __iomem		*base;
	void __iomem		*base;
	struct clk		*clk;
	struct clk		*clk;
	struct clk		*extclk[2];
	struct {
	struct {
		uint32_t	spu_v_h_total;
		uint32_t	spu_v_h_total;
		uint32_t	spu_v_porch;
		uint32_t	spu_v_porch;
+2 −4
Original line number Original line Diff line number Diff line
@@ -61,8 +61,7 @@ struct armada_private;
struct armada_variant {
struct armada_variant {
	bool has_spu_adv_reg;
	bool has_spu_adv_reg;
	uint32_t spu_adv_reg;
	uint32_t spu_adv_reg;
	int (*init)(struct armada_private *, struct device *);
	int (*crtc_init)(struct armada_crtc *, struct device *);
	int (*crtc_init)(struct armada_crtc *);
	int (*crtc_compute_clock)(struct armada_crtc *,
	int (*crtc_compute_clock)(struct armada_crtc *,
				  const struct drm_display_mode *,
				  const struct drm_display_mode *,
				  uint32_t *);
				  uint32_t *);
@@ -78,7 +77,6 @@ struct armada_private {
	struct drm_fb_helper	*fbdev;
	struct drm_fb_helper	*fbdev;
	struct armada_crtc	*dcrtc[2];
	struct armada_crtc	*dcrtc[2];
	struct drm_mm		linear;
	struct drm_mm		linear;
	struct clk		*extclk[2];
	struct drm_property	*csc_yuv_prop;
	struct drm_property	*csc_yuv_prop;
	struct drm_property	*csc_rgb_prop;
	struct drm_property	*csc_rgb_prop;
	struct drm_property	*colorkey_prop;
	struct drm_property	*colorkey_prop;
+0 −4
Original line number Original line Diff line number Diff line
@@ -130,10 +130,6 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)


	priv->variant = (struct armada_variant *)id->driver_data;
	priv->variant = (struct armada_variant *)id->driver_data;


	ret = priv->variant->init(priv, dev->dev);
	if (ret)
		return ret;

	INIT_WORK(&priv->fb_unref_work, armada_drm_unref_work);
	INIT_WORK(&priv->fb_unref_work, armada_drm_unref_work);
	INIT_KFIFO(priv->fb_unref);
	INIT_KFIFO(priv->fb_unref);