diff options
Diffstat (limited to 'drivers/gpu/drm/rockchip')
| -rw-r--r-- | drivers/gpu/drm/rockchip/cdn-dp-core.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 34 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/inno_hdmi.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rk3066_hdmi.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 45 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_fb.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_lvds.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 2 | 
14 files changed, 51 insertions, 81 deletions
| diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index 518ee13b1d6f..8526dda91931 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -571,7 +571,7 @@ static void cdn_dp_encoder_mode_set(struct drm_encoder *encoder,  	video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);  	video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); -	memcpy(&dp->mode, adjusted, sizeof(*mode)); +	drm_mode_copy(&dp->mode, adjusted);  }  static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c index bf6948125b84..7901c3babc8c 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c @@ -364,12 +364,6 @@ static inline u32 dsi_read(struct dw_mipi_dsi_rockchip *dsi, u32 reg)  	return readl(dsi->base + reg);  } -static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg, -				   u32 mask, u32 val) -{ -	dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val); -} -  static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi,  				  u8 test_code,  				  u8 test_data) @@ -752,7 +746,7 @@ static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)  static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,  					    int mux)  { -	if (dsi->cdata->lcdsel_grf_reg < 0) +	if (dsi->cdata->lcdsel_grf_reg)  		regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,  			mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);  } @@ -1051,23 +1045,31 @@ static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,  	if (ret) {  		DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",  					ret); -		return ret; +		goto out;  	}  	second = dw_mipi_dsi_rockchip_find_second(dsi); -	if (IS_ERR(second)) -		return PTR_ERR(second); +	if (IS_ERR(second)) { +		ret = PTR_ERR(second); +		goto out; +	}  	if (second) {  		ret = component_add(second, &dw_mipi_dsi_rockchip_ops);  		if (ret) {  			DRM_DEV_ERROR(second,  				      "Failed to register component: %d\n",  				      ret); -			return ret; +			goto out;  		}  	}  	return 0; + +out: +	mutex_lock(&dsi->usage_mutex); +	dsi->usage_mode = DW_DSI_USAGE_IDLE; +	mutex_unlock(&dsi->usage_mutex); +	return ret;  }  static int dw_mipi_dsi_rockchip_host_detach(void *priv_data, @@ -1213,7 +1215,7 @@ static int dw_mipi_dsi_dphy_power_on(struct phy *phy)  		return i;  	} -	ret = pm_runtime_get_sync(dsi->dev); +	ret = pm_runtime_resume_and_get(dsi->dev);  	if (ret < 0) {  		DRM_DEV_ERROR(dsi->dev, "failed to enable device: %d\n", ret);  		return ret; @@ -1635,7 +1637,6 @@ static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {  static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = {  	{  		.reg = 0xfe060000, -		.lcdsel_grf_reg = -1,  		.lanecfg1_grf_reg = RK3568_GRF_VO_CON2,  		.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI0_SKEWCALHS |  					  RK3568_DSI0_FORCETXSTOPMODE | @@ -1645,7 +1646,6 @@ static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = {  	},  	{  		.reg = 0xfe070000, -		.lcdsel_grf_reg = -1,  		.lanecfg1_grf_reg = RK3568_GRF_VO_CON3,  		.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI1_SKEWCALHS |  					  RK3568_DSI1_FORCETXSTOPMODE | @@ -1681,5 +1681,11 @@ struct platform_driver dw_mipi_dsi_rockchip_driver = {  		.of_match_table = dw_mipi_dsi_rockchip_dt_ids,  		.pm	= &dw_mipi_dsi_rockchip_pm_ops,  		.name	= "dw-mipi-dsi-rockchip", +		/* +		 * For dual-DSI display, one DSI pokes at the other DSI's +		 * drvdata in dw_mipi_dsi_rockchip_find_second(). This is not +		 * safe for asynchronous probe. +		 */ +		.probe_type = PROBE_FORCE_SYNCHRONOUS,  	},  }; diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index c14f88893868..2f4b8f64cbad 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -565,7 +565,8 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,  	ret = rockchip_hdmi_parse_dt(hdmi);  	if (ret) { -		DRM_DEV_ERROR(hdmi->dev, "Unable to parse OF data\n"); +		if (ret != -EPROBE_DEFER) +			DRM_DEV_ERROR(hdmi->dev, "Unable to parse OF data\n");  		return ret;  	} diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c index 87b2243ea23e..f51774866f41 100644 --- a/drivers/gpu/drm/rockchip/inno_hdmi.c +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c @@ -499,7 +499,7 @@ static void inno_hdmi_encoder_mode_set(struct drm_encoder *encoder,  	inno_hdmi_setup(hdmi, adj_mode);  	/* Store the display mode for plugin/DPMS poweron events */ -	memcpy(&hdmi->previous_mode, adj_mode, sizeof(hdmi->previous_mode)); +	drm_mode_copy(&hdmi->previous_mode, adj_mode);  }  static void inno_hdmi_encoder_enable(struct drm_encoder *encoder) diff --git a/drivers/gpu/drm/rockchip/rk3066_hdmi.c b/drivers/gpu/drm/rockchip/rk3066_hdmi.c index cf2cf51091a3..90145ad96984 100644 --- a/drivers/gpu/drm/rockchip/rk3066_hdmi.c +++ b/drivers/gpu/drm/rockchip/rk3066_hdmi.c @@ -395,7 +395,7 @@ rk3066_hdmi_encoder_mode_set(struct drm_encoder *encoder,  	struct rk3066_hdmi *hdmi = encoder_to_rk3066_hdmi(encoder);  	/* Store the display mode for plugin/DPMS poweron events. */ -	memcpy(&hdmi->previous_mode, adj_mode, sizeof(hdmi->previous_mode)); +	drm_mode_copy(&hdmi->previous_mode, adj_mode);  }  static void rk3066_hdmi_encoder_enable(struct drm_encoder *encoder) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 813f9f8c8698..6e0788d14c10 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -17,7 +17,7 @@  #include <drm/drm_aperture.h>  #include <drm/drm_drv.h> -#include <drm/drm_fb_helper.h> +#include <drm/drm_fbdev_generic.h>  #include <drm/drm_gem_dma_helper.h>  #include <drm/drm_of.h>  #include <drm/drm_probe_helper.h> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 1641440837af..aeb03a57240f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -9,10 +9,10 @@  #ifndef _ROCKCHIP_DRM_DRV_H  #define _ROCKCHIP_DRM_DRV_H -#include <drm/drm_fb_helper.h>  #include <drm/drm_atomic_helper.h>  #include <drm/drm_gem.h> +#include <linux/i2c.h>  #include <linux/module.h>  #include <linux/component.h> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index 092bf863110b..cfe8b793d344 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -9,7 +9,6 @@  #include <drm/drm.h>  #include <drm/drm_atomic.h>  #include <drm/drm_damage_helper.h> -#include <drm/drm_fb_helper.h>  #include <drm/drm_fourcc.h>  #include <drm/drm_framebuffer.h>  #include <drm/drm_gem_framebuffer_helper.h> @@ -25,35 +24,6 @@ static const struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {  	.dirty	       = drm_atomic_helper_dirtyfb,  }; -static struct drm_framebuffer * -rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd, -		  struct drm_gem_object **obj, unsigned int num_planes) -{ -	struct drm_framebuffer *fb; -	int ret; -	int i; - -	fb = kzalloc(sizeof(*fb), GFP_KERNEL); -	if (!fb) -		return ERR_PTR(-ENOMEM); - -	drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd); - -	for (i = 0; i < num_planes; i++) -		fb->obj[i] = obj[i]; - -	ret = drm_framebuffer_init(dev, fb, &rockchip_drm_fb_funcs); -	if (ret) { -		DRM_DEV_ERROR(dev->dev, -			      "Failed to initialize framebuffer: %d\n", -			      ret); -		kfree(fb); -		return ERR_PTR(ret); -	} - -	return fb; -} -  static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers = {  	.atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,  }; @@ -101,25 +71,10 @@ rockchip_fb_create(struct drm_device *dev, struct drm_file *file,  static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {  	.fb_create = rockchip_fb_create, -	.output_poll_changed = drm_fb_helper_output_poll_changed,  	.atomic_check = drm_atomic_helper_check,  	.atomic_commit = drm_atomic_helper_commit,  }; -struct drm_framebuffer * -rockchip_drm_framebuffer_init(struct drm_device *dev, -			      const struct drm_mode_fb_cmd2 *mode_cmd, -			      struct drm_gem_object *obj) -{ -	struct drm_framebuffer *fb; - -	fb = rockchip_fb_alloc(dev, mode_cmd, &obj, 1); -	if (IS_ERR(fb)) -		return ERR_CAST(fb); - -	return fb; -} -  void rockchip_drm_mode_config_init(struct drm_device *dev)  {  	dev->mode_config.min_width = 0; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h index 1a696521096d..bae4e079dfb1 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h @@ -7,11 +7,5 @@  #ifndef _ROCKCHIP_DRM_FB_H  #define _ROCKCHIP_DRM_FB_H -struct drm_framebuffer * -rockchip_drm_framebuffer_init(struct drm_device *dev, -			      const struct drm_mode_fb_cmd2 *mode_cmd, -			      struct drm_gem_object *obj); -void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb); -  void rockchip_drm_mode_config_init(struct drm_device *dev);  #endif /* _ROCKCHIP_DRM_FB_H */ diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 614e97aaac80..6edb7c52cb3d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -9,6 +9,7 @@  #include <linux/vmalloc.h>  #include <drm/drm.h> +#include <drm/drm_fb_helper.h>  #include <drm/drm_gem.h>  #include <drm/drm_gem_dma_helper.h>  #include <drm/drm_prime.h> @@ -364,9 +365,12 @@ rockchip_gem_create_with_handle(struct drm_file *file_priv,  {  	struct rockchip_gem_object *rk_obj;  	struct drm_gem_object *obj; +	bool is_framebuffer;  	int ret; -	rk_obj = rockchip_gem_create_object(drm, size, false); +	is_framebuffer = drm->fb_helper && file_priv == drm->fb_helper->client.file; + +	rk_obj = rockchip_gem_create_object(drm, size, is_framebuffer);  	if (IS_ERR(rk_obj))  		return ERR_CAST(rk_obj); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index c356de5dd220..fa1f4ee6d195 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -602,7 +602,7 @@ static int vop_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state)  	struct vop *vop = to_vop(crtc);  	int ret, i; -	ret = pm_runtime_get_sync(vop->dev); +	ret = pm_runtime_resume_and_get(vop->dev);  	if (ret < 0) {  		DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret);  		return ret; @@ -1983,7 +1983,7 @@ static int vop_initial(struct vop *vop)  		return PTR_ERR(vop->dclk);  	} -	ret = pm_runtime_get_sync(vop->dev); +	ret = pm_runtime_resume_and_get(vop->dev);  	if (ret < 0) {  		DRM_DEV_ERROR(vop->dev, "failed to get pm runtime: %d\n", ret);  		return ret; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index aac20be5ac08..8cecf81a5ae0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -822,7 +822,7 @@ static void vop2_enable(struct vop2 *vop2)  {  	int ret; -	ret = pm_runtime_get_sync(vop2->dev); +	ret = pm_runtime_resume_and_get(vop2->dev);  	if (ret < 0) {  		drm_err(vop2->drm, "failed to get pm runtime: %d\n", ret);  		return; @@ -877,10 +877,14 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,  {  	struct vop2_video_port *vp = to_vop2_video_port(crtc);  	struct vop2 *vop2 = vp->vop2; +	struct drm_crtc_state *old_crtc_state;  	int ret;  	vop2_lock(vop2); +	old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc); +	drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false); +  	drm_crtc_vblank_off(crtc);  	/* @@ -996,13 +1000,15 @@ static int vop2_plane_atomic_check(struct drm_plane *plane,  static void vop2_plane_atomic_disable(struct drm_plane *plane,  				      struct drm_atomic_state *state)  { -	struct drm_plane_state *old_pstate = drm_atomic_get_old_plane_state(state, plane); +	struct drm_plane_state *old_pstate = NULL;  	struct vop2_win *win = to_vop2_win(plane);  	struct vop2 *vop2 = win->vop2;  	drm_dbg(vop2->drm, "%s disable\n", win->data->name); -	if (!old_pstate->crtc) +	if (state) +		old_pstate = drm_atomic_get_old_plane_state(state, plane); +	if (old_pstate && !old_pstate->crtc)  		return;  	vop2_win_disable(win); diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index 5a284332ec49..68f6ebb33460 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -152,7 +152,7 @@ static int rk3288_lvds_poweron(struct rockchip_lvds *lvds)  		DRM_DEV_ERROR(lvds->dev, "failed to enable lvds pclk %d\n", ret);  		return ret;  	} -	ret = pm_runtime_get_sync(lvds->dev); +	ret = pm_runtime_resume_and_get(lvds->dev);  	if (ret < 0) {  		DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret);  		clk_disable(lvds->pclk); @@ -336,16 +336,20 @@ static int px30_lvds_poweron(struct rockchip_lvds *lvds)  {  	int ret; -	ret = pm_runtime_get_sync(lvds->dev); +	ret = pm_runtime_resume_and_get(lvds->dev);  	if (ret < 0) {  		DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret);  		return ret;  	}  	/* Enable LVDS mode */ -	return regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, +	ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1,  				  PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1),  				  PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1)); +	if (ret) +		pm_runtime_put(lvds->dev); + +	return ret;  }  static void px30_lvds_poweroff(struct rockchip_lvds *lvds) diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 9bf0637bf8e2..9d30aa73b542 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -188,7 +188,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {  		.base = 0x1800,  		.layer_sel_id = 2,  		.supported_rotations = DRM_MODE_REFLECT_Y, -		.type = DRM_PLANE_TYPE_OVERLAY, +		.type = DRM_PLANE_TYPE_PRIMARY,  		.max_upscale_factor = 8,  		.max_downscale_factor = 8,  		.dly = { 20, 47, 41 }, |