|
@@ -767,7 +767,8 @@ static irqreturn_t rcar_du_crtc_irq(int irq, void *arg)
|
|
|
* Initialization
|
|
|
*/
|
|
|
|
|
|
-int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
+int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int swindex,
|
|
|
+ unsigned int hwindex)
|
|
|
{
|
|
|
static const unsigned int mmio_offsets[] = {
|
|
|
DU0_REG_OFFSET, DU1_REG_OFFSET, DU2_REG_OFFSET, DU3_REG_OFFSET
|
|
@@ -775,7 +776,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
|
|
|
struct rcar_du_device *rcdu = rgrp->dev;
|
|
|
struct platform_device *pdev = to_platform_device(rcdu->dev);
|
|
|
- struct rcar_du_crtc *rcrtc = &rcdu->crtcs[index];
|
|
|
+ struct rcar_du_crtc *rcrtc = &rcdu->crtcs[swindex];
|
|
|
struct drm_crtc *crtc = &rcrtc->crtc;
|
|
|
struct drm_plane *primary;
|
|
|
unsigned int irqflags;
|
|
@@ -787,7 +788,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
|
|
|
/* Get the CRTC clock and the optional external clock. */
|
|
|
if (rcar_du_has(rcdu, RCAR_DU_FEATURE_CRTC_IRQ_CLOCK)) {
|
|
|
- sprintf(clk_name, "du.%u", index);
|
|
|
+ sprintf(clk_name, "du.%u", hwindex);
|
|
|
name = clk_name;
|
|
|
} else {
|
|
|
name = NULL;
|
|
@@ -795,16 +796,16 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
|
|
|
rcrtc->clock = devm_clk_get(rcdu->dev, name);
|
|
|
if (IS_ERR(rcrtc->clock)) {
|
|
|
- dev_err(rcdu->dev, "no clock for CRTC %u\n", index);
|
|
|
+ dev_err(rcdu->dev, "no clock for DU channel %u\n", hwindex);
|
|
|
return PTR_ERR(rcrtc->clock);
|
|
|
}
|
|
|
|
|
|
- sprintf(clk_name, "dclkin.%u", index);
|
|
|
+ sprintf(clk_name, "dclkin.%u", hwindex);
|
|
|
clk = devm_clk_get(rcdu->dev, clk_name);
|
|
|
if (!IS_ERR(clk)) {
|
|
|
rcrtc->extclock = clk;
|
|
|
} else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) {
|
|
|
- dev_info(rcdu->dev, "can't get external clock %u\n", index);
|
|
|
+ dev_info(rcdu->dev, "can't get external clock %u\n", hwindex);
|
|
|
return -EPROBE_DEFER;
|
|
|
}
|
|
|
|
|
@@ -813,13 +814,13 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
spin_lock_init(&rcrtc->vblank_lock);
|
|
|
|
|
|
rcrtc->group = rgrp;
|
|
|
- rcrtc->mmio_offset = mmio_offsets[index];
|
|
|
- rcrtc->index = index;
|
|
|
+ rcrtc->mmio_offset = mmio_offsets[hwindex];
|
|
|
+ rcrtc->index = hwindex;
|
|
|
|
|
|
if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE))
|
|
|
primary = &rcrtc->vsp->planes[rcrtc->vsp_pipe].plane;
|
|
|
else
|
|
|
- primary = &rgrp->planes[index % 2].plane;
|
|
|
+ primary = &rgrp->planes[swindex % 2].plane;
|
|
|
|
|
|
ret = drm_crtc_init_with_planes(rcdu->ddev, crtc, primary,
|
|
|
NULL, &crtc_funcs, NULL);
|
|
@@ -833,7 +834,8 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
|
|
|
/* Register the interrupt handler. */
|
|
|
if (rcar_du_has(rcdu, RCAR_DU_FEATURE_CRTC_IRQ_CLOCK)) {
|
|
|
- irq = platform_get_irq(pdev, index);
|
|
|
+ /* The IRQ's are associated with the CRTC (sw)index. */
|
|
|
+ irq = platform_get_irq(pdev, swindex);
|
|
|
irqflags = 0;
|
|
|
} else {
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
@@ -841,7 +843,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
}
|
|
|
|
|
|
if (irq < 0) {
|
|
|
- dev_err(rcdu->dev, "no IRQ for CRTC %u\n", index);
|
|
|
+ dev_err(rcdu->dev, "no IRQ for CRTC %u\n", swindex);
|
|
|
return irq;
|
|
|
}
|
|
|
|
|
@@ -849,7 +851,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
|
|
|
dev_name(rcdu->dev), rcrtc);
|
|
|
if (ret < 0) {
|
|
|
dev_err(rcdu->dev,
|
|
|
- "failed to register IRQ for CRTC %u\n", index);
|
|
|
+ "failed to register IRQ for CRTC %u\n", swindex);
|
|
|
return ret;
|
|
|
}
|
|
|
|