diff options
Diffstat (limited to 'drivers/gpu/drm/imx/ipuv3-crtc.c')
-rw-r--r-- | drivers/gpu/drm/imx/ipuv3-crtc.c | 63 |
1 files changed, 17 insertions, 46 deletions
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c index 7bc8301fafff..4ab841eebee1 100644 --- a/drivers/gpu/drm/imx/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c | |||
@@ -212,7 +212,8 @@ static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc) | |||
212 | 212 | ||
213 | spin_lock_irqsave(&drm->event_lock, flags); | 213 | spin_lock_irqsave(&drm->event_lock, flags); |
214 | if (ipu_crtc->page_flip_event) | 214 | if (ipu_crtc->page_flip_event) |
215 | drm_send_vblank_event(drm, -1, ipu_crtc->page_flip_event); | 215 | drm_crtc_send_vblank_event(&ipu_crtc->base, |
216 | ipu_crtc->page_flip_event); | ||
216 | ipu_crtc->page_flip_event = NULL; | 217 | ipu_crtc->page_flip_event = NULL; |
217 | imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc); | 218 | imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc); |
218 | spin_unlock_irqrestore(&drm->event_lock, flags); | 219 | spin_unlock_irqrestore(&drm->event_lock, flags); |
@@ -349,7 +350,6 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc, | |||
349 | struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); | 350 | struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); |
350 | int dp = -EINVAL; | 351 | int dp = -EINVAL; |
351 | int ret; | 352 | int ret; |
352 | int id; | ||
353 | 353 | ||
354 | ret = ipu_get_resources(ipu_crtc, pdata); | 354 | ret = ipu_get_resources(ipu_crtc, pdata); |
355 | if (ret) { | 355 | if (ret) { |
@@ -358,18 +358,23 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc, | |||
358 | return ret; | 358 | return ret; |
359 | } | 359 | } |
360 | 360 | ||
361 | if (pdata->dp >= 0) | ||
362 | dp = IPU_DP_FLOW_SYNC_BG; | ||
363 | ipu_crtc->plane[0] = ipu_plane_init(drm, ipu, pdata->dma[0], dp, 0, | ||
364 | DRM_PLANE_TYPE_PRIMARY); | ||
365 | if (IS_ERR(ipu_crtc->plane[0])) { | ||
366 | ret = PTR_ERR(ipu_crtc->plane[0]); | ||
367 | goto err_put_resources; | ||
368 | } | ||
369 | |||
361 | ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc, | 370 | ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc, |
362 | &ipu_crtc_helper_funcs, ipu_crtc->dev->of_node); | 371 | &ipu_crtc->plane[0]->base, &ipu_crtc_helper_funcs, |
372 | ipu_crtc->dev->of_node); | ||
363 | if (ret) { | 373 | if (ret) { |
364 | dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret); | 374 | dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret); |
365 | goto err_put_resources; | 375 | goto err_put_resources; |
366 | } | 376 | } |
367 | 377 | ||
368 | if (pdata->dp >= 0) | ||
369 | dp = IPU_DP_FLOW_SYNC_BG; | ||
370 | id = imx_drm_crtc_id(ipu_crtc->imx_crtc); | ||
371 | ipu_crtc->plane[0] = ipu_plane_init(ipu_crtc->base.dev, ipu, | ||
372 | pdata->dma[0], dp, BIT(id), true); | ||
373 | ret = ipu_plane_get_resources(ipu_crtc->plane[0]); | 378 | ret = ipu_plane_get_resources(ipu_crtc->plane[0]); |
374 | if (ret) { | 379 | if (ret) { |
375 | dev_err(ipu_crtc->dev, "getting plane 0 resources failed with %d.\n", | 380 | dev_err(ipu_crtc->dev, "getting plane 0 resources failed with %d.\n", |
@@ -379,10 +384,10 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc, | |||
379 | 384 | ||
380 | /* If this crtc is using the DP, add an overlay plane */ | 385 | /* If this crtc is using the DP, add an overlay plane */ |
381 | if (pdata->dp >= 0 && pdata->dma[1] > 0) { | 386 | if (pdata->dp >= 0 && pdata->dma[1] > 0) { |
382 | ipu_crtc->plane[1] = ipu_plane_init(ipu_crtc->base.dev, ipu, | 387 | ipu_crtc->plane[1] = ipu_plane_init(drm, ipu, pdata->dma[1], |
383 | pdata->dma[1], | 388 | IPU_DP_FLOW_SYNC_FG, |
384 | IPU_DP_FLOW_SYNC_FG, | 389 | drm_crtc_mask(&ipu_crtc->base), |
385 | BIT(id), false); | 390 | DRM_PLANE_TYPE_OVERLAY); |
386 | if (IS_ERR(ipu_crtc->plane[1])) | 391 | if (IS_ERR(ipu_crtc->plane[1])) |
387 | ipu_crtc->plane[1] = NULL; | 392 | ipu_crtc->plane[1] = NULL; |
388 | } | 393 | } |
@@ -407,28 +412,6 @@ err_put_resources: | |||
407 | return ret; | 412 | return ret; |
408 | } | 413 | } |
409 | 414 | ||
410 | static struct device_node *ipu_drm_get_port_by_id(struct device_node *parent, | ||
411 | int port_id) | ||
412 | { | ||
413 | struct device_node *port; | ||
414 | int id, ret; | ||
415 | |||
416 | port = of_get_child_by_name(parent, "port"); | ||
417 | while (port) { | ||
418 | ret = of_property_read_u32(port, "reg", &id); | ||
419 | if (!ret && id == port_id) | ||
420 | return port; | ||
421 | |||
422 | do { | ||
423 | port = of_get_next_child(parent, port); | ||
424 | if (!port) | ||
425 | return NULL; | ||
426 | } while (of_node_cmp(port->name, "port")); | ||
427 | } | ||
428 | |||
429 | return NULL; | ||
430 | } | ||
431 | |||
432 | static int ipu_drm_bind(struct device *dev, struct device *master, void *data) | 415 | static int ipu_drm_bind(struct device *dev, struct device *master, void *data) |
433 | { | 416 | { |
434 | struct ipu_client_platformdata *pdata = dev->platform_data; | 417 | struct ipu_client_platformdata *pdata = dev->platform_data; |
@@ -470,23 +453,11 @@ static const struct component_ops ipu_crtc_ops = { | |||
470 | static int ipu_drm_probe(struct platform_device *pdev) | 453 | static int ipu_drm_probe(struct platform_device *pdev) |
471 | { | 454 | { |
472 | struct device *dev = &pdev->dev; | 455 | struct device *dev = &pdev->dev; |
473 | struct ipu_client_platformdata *pdata = dev->platform_data; | ||
474 | int ret; | 456 | int ret; |
475 | 457 | ||
476 | if (!dev->platform_data) | 458 | if (!dev->platform_data) |
477 | return -EINVAL; | 459 | return -EINVAL; |
478 | 460 | ||
479 | if (!dev->of_node) { | ||
480 | /* Associate crtc device with the corresponding DI port node */ | ||
481 | dev->of_node = ipu_drm_get_port_by_id(dev->parent->of_node, | ||
482 | pdata->di + 2); | ||
483 | if (!dev->of_node) { | ||
484 | dev_err(dev, "missing port@%d node in %s\n", | ||
485 | pdata->di + 2, dev->parent->of_node->full_name); | ||
486 | return -ENODEV; | ||
487 | } | ||
488 | } | ||
489 | |||
490 | ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); | 461 | ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); |
491 | if (ret) | 462 | if (ret) |
492 | return ret; | 463 | return ret; |