|
@@ -212,7 +212,8 @@ static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc)
|
|
|
|
|
|
spin_lock_irqsave(&drm->event_lock, flags);
|
|
|
if (ipu_crtc->page_flip_event)
|
|
|
- drm_send_vblank_event(drm, -1, ipu_crtc->page_flip_event);
|
|
|
+ drm_crtc_send_vblank_event(&ipu_crtc->base,
|
|
|
+ ipu_crtc->page_flip_event);
|
|
|
ipu_crtc->page_flip_event = NULL;
|
|
|
imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc);
|
|
|
spin_unlock_irqrestore(&drm->event_lock, flags);
|
|
@@ -349,7 +350,6 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
|
|
|
struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
|
|
|
int dp = -EINVAL;
|
|
|
int ret;
|
|
|
- int id;
|
|
|
|
|
|
ret = ipu_get_resources(ipu_crtc, pdata);
|
|
|
if (ret) {
|
|
@@ -358,18 +358,23 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ if (pdata->dp >= 0)
|
|
|
+ dp = IPU_DP_FLOW_SYNC_BG;
|
|
|
+ ipu_crtc->plane[0] = ipu_plane_init(drm, ipu, pdata->dma[0], dp, 0,
|
|
|
+ DRM_PLANE_TYPE_PRIMARY);
|
|
|
+ if (IS_ERR(ipu_crtc->plane[0])) {
|
|
|
+ ret = PTR_ERR(ipu_crtc->plane[0]);
|
|
|
+ goto err_put_resources;
|
|
|
+ }
|
|
|
+
|
|
|
ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc,
|
|
|
- &ipu_crtc_helper_funcs, ipu_crtc->dev->of_node);
|
|
|
+ &ipu_crtc->plane[0]->base, &ipu_crtc_helper_funcs,
|
|
|
+ ipu_crtc->dev->of_node);
|
|
|
if (ret) {
|
|
|
dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret);
|
|
|
goto err_put_resources;
|
|
|
}
|
|
|
|
|
|
- if (pdata->dp >= 0)
|
|
|
- dp = IPU_DP_FLOW_SYNC_BG;
|
|
|
- id = imx_drm_crtc_id(ipu_crtc->imx_crtc);
|
|
|
- ipu_crtc->plane[0] = ipu_plane_init(ipu_crtc->base.dev, ipu,
|
|
|
- pdata->dma[0], dp, BIT(id), true);
|
|
|
ret = ipu_plane_get_resources(ipu_crtc->plane[0]);
|
|
|
if (ret) {
|
|
|
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,
|
|
|
|
|
|
/* If this crtc is using the DP, add an overlay plane */
|
|
|
if (pdata->dp >= 0 && pdata->dma[1] > 0) {
|
|
|
- ipu_crtc->plane[1] = ipu_plane_init(ipu_crtc->base.dev, ipu,
|
|
|
- pdata->dma[1],
|
|
|
- IPU_DP_FLOW_SYNC_FG,
|
|
|
- BIT(id), false);
|
|
|
+ ipu_crtc->plane[1] = ipu_plane_init(drm, ipu, pdata->dma[1],
|
|
|
+ IPU_DP_FLOW_SYNC_FG,
|
|
|
+ drm_crtc_mask(&ipu_crtc->base),
|
|
|
+ DRM_PLANE_TYPE_OVERLAY);
|
|
|
if (IS_ERR(ipu_crtc->plane[1]))
|
|
|
ipu_crtc->plane[1] = NULL;
|
|
|
}
|
|
@@ -407,28 +412,6 @@ err_put_resources:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static struct device_node *ipu_drm_get_port_by_id(struct device_node *parent,
|
|
|
- int port_id)
|
|
|
-{
|
|
|
- struct device_node *port;
|
|
|
- int id, ret;
|
|
|
-
|
|
|
- port = of_get_child_by_name(parent, "port");
|
|
|
- while (port) {
|
|
|
- ret = of_property_read_u32(port, "reg", &id);
|
|
|
- if (!ret && id == port_id)
|
|
|
- return port;
|
|
|
-
|
|
|
- do {
|
|
|
- port = of_get_next_child(parent, port);
|
|
|
- if (!port)
|
|
|
- return NULL;
|
|
|
- } while (of_node_cmp(port->name, "port"));
|
|
|
- }
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
|
|
|
{
|
|
|
struct ipu_client_platformdata *pdata = dev->platform_data;
|
|
@@ -470,23 +453,11 @@ static const struct component_ops ipu_crtc_ops = {
|
|
|
static int ipu_drm_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct device *dev = &pdev->dev;
|
|
|
- struct ipu_client_platformdata *pdata = dev->platform_data;
|
|
|
int ret;
|
|
|
|
|
|
if (!dev->platform_data)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!dev->of_node) {
|
|
|
- /* Associate crtc device with the corresponding DI port node */
|
|
|
- dev->of_node = ipu_drm_get_port_by_id(dev->parent->of_node,
|
|
|
- pdata->di + 2);
|
|
|
- if (!dev->of_node) {
|
|
|
- dev_err(dev, "missing port@%d node in %s\n",
|
|
|
- pdata->di + 2, dev->parent->of_node->full_name);
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
|
|
|
if (ret)
|
|
|
return ret;
|