diff options
Diffstat (limited to 'drivers/gpu/drm/sun4i')
| -rw-r--r-- | drivers/gpu/drm/sun4i/sun4i_backend.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/sun4i/sun4i_frontend.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/sun4i/sun4i_frontend.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 1 | 
4 files changed, 19 insertions, 32 deletions
| diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c index 77497b45f9a2..55960cbb1019 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.c +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c @@ -814,9 +814,15 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,  		 *  		 * XXX(hch): this has no business in a driver and needs to move  		 * to the device tree. +		 * +		 * If we have two subsequent calls to dma_direct_set_offset +		 * returns -EINVAL. Unfortunately, this happens when we have two +		 * backends in the system, and will result in the driver +		 * reporting an error while it has been setup properly before. +		 * Ignore EINVAL, but it should really be removed eventually.  		 */  		ret = dma_direct_set_offset(drm->dev, PHYS_OFFSET, 0, SZ_4G); -		if (ret) +		if (ret && ret != -EINVAL)  			return ret;  	} diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.c b/drivers/gpu/drm/sun4i/sun4i_frontend.c index b51cc685c13a..edb60ae0a9b7 100644 --- a/drivers/gpu/drm/sun4i/sun4i_frontend.c +++ b/drivers/gpu/drm/sun4i/sun4i_frontend.c @@ -407,6 +407,7 @@ int sun4i_frontend_update_formats(struct sun4i_frontend *frontend,  	struct drm_framebuffer *fb = state->fb;  	const struct drm_format_info *format = fb->format;  	uint64_t modifier = fb->modifier; +	unsigned int ch1_phase_idx;  	u32 out_fmt_val;  	u32 in_fmt_val, in_mod_val, in_ps_val;  	unsigned int i; @@ -442,18 +443,19 @@ int sun4i_frontend_update_formats(struct sun4i_frontend *frontend,  	 * I have no idea what this does exactly, but it seems to be  	 * related to the scaler FIR filter phase parameters.  	 */ +	ch1_phase_idx = (format->num_planes > 1) ? 1 : 0;  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_HORZPHASE_REG, -		     frontend->data->ch_phase[0].horzphase); +		     frontend->data->ch_phase[0]);  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_HORZPHASE_REG, -		     frontend->data->ch_phase[1].horzphase); +		     frontend->data->ch_phase[ch1_phase_idx]);  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_VERTPHASE0_REG, -		     frontend->data->ch_phase[0].vertphase[0]); +		     frontend->data->ch_phase[0]);  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_VERTPHASE0_REG, -		     frontend->data->ch_phase[1].vertphase[0]); +		     frontend->data->ch_phase[ch1_phase_idx]);  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_VERTPHASE1_REG, -		     frontend->data->ch_phase[0].vertphase[1]); +		     frontend->data->ch_phase[0]);  	regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_VERTPHASE1_REG, -		     frontend->data->ch_phase[1].vertphase[1]); +		     frontend->data->ch_phase[ch1_phase_idx]);  	/*  	 * Checking the input format is sufficient since we currently only @@ -687,30 +689,12 @@ static const struct dev_pm_ops sun4i_frontend_pm_ops = {  };  static const struct sun4i_frontend_data sun4i_a10_frontend = { -	.ch_phase		= { -		{ -			.horzphase = 0, -			.vertphase = { 0, 0 }, -		}, -		{ -			.horzphase = 0xfc000, -			.vertphase = { 0xfc000, 0xfc000 }, -		}, -	}, +	.ch_phase		= { 0x000, 0xfc000 },  	.has_coef_rdy		= true,  };  static const struct sun4i_frontend_data sun8i_a33_frontend = { -	.ch_phase		= { -		{ -			.horzphase = 0x400, -			.vertphase = { 0x400, 0x400 }, -		}, -		{ -			.horzphase = 0x400, -			.vertphase = { 0x400, 0x400 }, -		}, -	}, +	.ch_phase		= { 0x400, 0xfc400 },  	.has_coef_access_ctrl	= true,  }; diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.h b/drivers/gpu/drm/sun4i/sun4i_frontend.h index 0c382c1ddb0f..2e7b76e50c2b 100644 --- a/drivers/gpu/drm/sun4i/sun4i_frontend.h +++ b/drivers/gpu/drm/sun4i/sun4i_frontend.h @@ -115,11 +115,7 @@ struct reset_control;  struct sun4i_frontend_data {  	bool	has_coef_access_ctrl;  	bool	has_coef_rdy; - -	struct { -		u32	horzphase; -		u32	vertphase[2]; -	} ch_phase[2]; +	u32	ch_phase[2];  };  struct sun4i_frontend { diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c index d4c08043dd81..92add2cef2e7 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c @@ -208,6 +208,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,  	phy_node = of_parse_phandle(dev->of_node, "phys", 0);  	if (!phy_node) {  		dev_err(dev, "Can't found PHY phandle\n"); +		ret = -EINVAL;  		goto err_disable_clk_tmds;  	} | 
