diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_vidi.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_vidi.c | 62 | 
1 files changed, 20 insertions, 42 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 99bfc38dfaa..13ccbd4bcfa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -98,10 +98,12 @@ static bool vidi_display_is_connected(struct device *dev)  	return ctx->connected ? true : false;  } -static int vidi_get_edid(struct device *dev, struct drm_connector *connector, -				u8 *edid, int len) +static struct edid *vidi_get_edid(struct device *dev, +			struct drm_connector *connector)  {  	struct vidi_context *ctx = get_vidi_context(dev); +	struct edid *edid; +	int edid_len;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -111,13 +113,18 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,  	 */  	if (!ctx->raw_edid) {  		DRM_DEBUG_KMS("raw_edid is null.\n"); -		return -EFAULT; +		return ERR_PTR(-EFAULT);  	} -	memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions) -					* EDID_LENGTH, len)); +	edid_len = (1 + ctx->raw_edid->extensions) * EDID_LENGTH; +	edid = kzalloc(edid_len, GFP_KERNEL); +	if (!edid) { +		DRM_DEBUG_KMS("failed to allocate edid\n"); +		return ERR_PTR(-ENOMEM); +	} -	return 0; +	memcpy(edid, ctx->raw_edid, edid_len); +	return edid;  }  static void *vidi_get_panel(struct device *dev) @@ -372,34 +379,6 @@ static struct exynos_drm_manager vidi_manager = {  	.display_ops	= &vidi_display_ops,  }; -static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc) -{ -	struct exynos_drm_private *dev_priv = drm_dev->dev_private; -	struct drm_pending_vblank_event *e, *t; -	struct timeval now; -	unsigned long flags; - -	spin_lock_irqsave(&drm_dev->event_lock, flags); - -	list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, -			base.link) { -		/* if event's pipe isn't same as crtc then ignore it. */ -		if (crtc != e->pipe) -			continue; - -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; - -		list_move_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -		drm_vblank_put(drm_dev, crtc); -	} - -	spin_unlock_irqrestore(&drm_dev->event_lock, flags); -} -  static void vidi_fake_vblank_handler(struct work_struct *work)  {  	struct vidi_context *ctx = container_of(work, struct vidi_context, @@ -424,7 +403,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)  	mutex_unlock(&ctx->lock); -	vidi_finish_pageflip(subdrv->drm_dev, manager->pipe); +	exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);  }  static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) @@ -542,7 +521,6 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	struct exynos_drm_manager *manager;  	struct exynos_drm_display_ops *display_ops;  	struct drm_exynos_vidi_connection *vidi = data; -	struct edid *raw_edid;  	int edid_len;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -579,11 +557,11 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	}  	if (vidi->connection) { -		if (!vidi->edid) { -			DRM_DEBUG_KMS("edid data is null.\n"); +		struct edid *raw_edid  = (struct edid *)(uint32_t)vidi->edid; +		if (!drm_edid_is_valid(raw_edid)) { +			DRM_DEBUG_KMS("edid data is invalid.\n");  			return -EINVAL;  		} -		raw_edid = (struct edid *)(uint32_t)vidi->edid;  		edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;  		ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);  		if (!ctx->raw_edid) { @@ -609,7 +587,7 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,  	return 0;  } -static int __devinit vidi_probe(struct platform_device *pdev) +static int vidi_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct vidi_context *ctx; @@ -645,7 +623,7 @@ static int __devinit vidi_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit vidi_remove(struct platform_device *pdev) +static int vidi_remove(struct platform_device *pdev)  {  	struct vidi_context *ctx = platform_get_drvdata(pdev); @@ -683,7 +661,7 @@ static const struct dev_pm_ops vidi_pm_ops = {  struct platform_driver vidi_driver = {  	.probe		= vidi_probe, -	.remove		= __devexit_p(vidi_remove), +	.remove		= vidi_remove,  	.driver		= {  		.name	= "exynos-drm-vidi",  		.owner	= THIS_MODULE,  |